Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Appelman <icewind1991@gmail.com>2012-01-08 04:53:40 +0400
committerRobin Appelman <icewind1991@gmail.com>2012-01-08 04:53:40 +0400
commitd1edc360d9bd7d97c35d25b54dadec61004cd869 (patch)
tree7344744268280ccbdc194746a7b40dfc90a33260
parent3844fb0e4ce093bb3c2e67d20f85f61b7723efdc (diff)
parent8f8985c3e53862e2ca6446f296d4835a9577faac (diff)
merge master into filesystem
-rw-r--r--.htaccess3
-rw-r--r--3rdparty/Sabre/LICENCE27
-rwxr-xr-x3rdparty/when/When.php4
-rw-r--r--apps/admin_export/appinfo/info.xml1
-rw-r--r--apps/calendar/ajax/activation.php7
-rw-r--r--apps/calendar/ajax/choosecalendar.php4
-rw-r--r--apps/calendar/ajax/createcalendar.php5
-rwxr-xr-xapps/calendar/ajax/daysofweekend.php11
-rw-r--r--apps/calendar/ajax/deletecalendar.php12
-rw-r--r--apps/calendar/ajax/deleteevent.php16
-rw-r--r--apps/calendar/ajax/duration.php12
-rw-r--r--apps/calendar/ajax/editcalendar.php8
-rw-r--r--apps/calendar/ajax/editevent.php27
-rw-r--r--apps/calendar/ajax/editeventform.php184
-rw-r--r--apps/calendar/ajax/events.php2
-rwxr-xr-xapps/calendar/ajax/firstdayofweek.php12
-rw-r--r--apps/calendar/ajax/gettimezonedetection.php11
-rwxr-xr-xapps/calendar/ajax/guesstimezone.php15
-rw-r--r--apps/calendar/ajax/importdialog.php2
-rw-r--r--apps/calendar/ajax/moveevent.php26
-rw-r--r--apps/calendar/ajax/newcalendar.php4
-rw-r--r--apps/calendar/ajax/newevent.php4
-rw-r--r--apps/calendar/ajax/neweventform.php35
-rw-r--r--apps/calendar/ajax/resizeevent.php35
-rwxr-xr-xapps/calendar/ajax/setdaysofweekend.php30
-rw-r--r--apps/calendar/ajax/setduration.php17
-rwxr-xr-xapps/calendar/ajax/setfirstdayofweek.php16
-rw-r--r--apps/calendar/ajax/timezonedetection.php17
-rw-r--r--apps/calendar/ajax/updatecalendar.php6
-rw-r--r--apps/calendar/appinfo/app.php46
-rw-r--r--apps/calendar/css/style.css2
-rw-r--r--apps/calendar/export.php36
-rw-r--r--apps/calendar/import.php8
-rw-r--r--apps/calendar/index.php7
-rw-r--r--apps/calendar/js/calendar.js147
-rwxr-xr-xapps/calendar/js/geo.js3
-rw-r--r--apps/calendar/js/settings.js64
-rw-r--r--apps/calendar/lib/app.php117
-rw-r--r--apps/calendar/lib/calendar.php4
-rw-r--r--apps/calendar/lib/object.php341
-rw-r--r--apps/calendar/lib/search.php27
-rw-r--r--apps/calendar/resettimezone.php4
-rwxr-xr-xapps/calendar/templates/calendar.php11
-rw-r--r--apps/calendar/templates/part.eventform.php251
-rw-r--r--apps/calendar/templates/settings.php2
-rw-r--r--apps/contacts/ajax/activation.php22
-rw-r--r--apps/contacts/ajax/addbook.php21
-rw-r--r--apps/contacts/ajax/addcard.php1
-rw-r--r--apps/contacts/ajax/chooseaddressbook.php16
-rw-r--r--apps/contacts/ajax/contacts.php35
-rw-r--r--apps/contacts/ajax/createaddressbook.php26
-rw-r--r--apps/contacts/ajax/deletebook.php4
-rw-r--r--apps/contacts/ajax/editaddressbook.php18
-rw-r--r--apps/contacts/ajax/updateaddressbook.php26
-rw-r--r--apps/contacts/css/styles.css3
-rw-r--r--apps/contacts/export.php39
-rw-r--r--apps/contacts/img/person.pngbin0 -> 978 bytes
-rw-r--r--apps/contacts/img/person.svg175
-rw-r--r--apps/contacts/index.php41
-rw-r--r--apps/contacts/js/LICENSE.jquery.inview41
-rw-r--r--apps/contacts/js/interface.js153
-rw-r--r--apps/contacts/js/jquery.inview.js118
-rw-r--r--apps/contacts/js/jquery.inview.txt15
-rw-r--r--apps/contacts/lib/addressbook.php121
-rw-r--r--apps/contacts/lib/app.php2
-rw-r--r--apps/contacts/lib/vcard.php24
-rw-r--r--apps/contacts/templates/index.php15
-rw-r--r--apps/contacts/templates/part.chooseaddressbook.php24
-rw-r--r--apps/contacts/templates/part.chooseaddressbook.rowfields.php5
-rw-r--r--apps/contacts/templates/part.contacts.php2
-rw-r--r--apps/contacts/templates/part.editaddressbook.php31
-rw-r--r--apps/contacts/templates/part.property.php2
-rw-r--r--apps/contacts/thumbnail.php150
-rwxr-xr-xapps/files_pdfviewer/appinfo/app.php9
-rwxr-xr-xapps/files_pdfviewer/appinfo/info.xml10
-rwxr-xr-xapps/files_pdfviewer/css/history.pngbin0 -> 539 bytes
-rwxr-xr-xapps/files_pdfviewer/css/style.css27
-rwxr-xr-xapps/files_pdfviewer/css/viewer.css277
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/LICENSE30
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/build/pdf.js27022
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/canvas.js869
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/charsets.js105
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/cidmaps.js6933
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/colorspace.js411
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/core.js652
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/crypto.js597
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/evaluator.js857
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/fonts.js3568
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/function.js351
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/glyphlist.js4292
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/image.js257
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/metrics.js2944
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/obj.js742
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/parser.js636
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/pattern.js291
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/pdf.js15
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/stream.js2113
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/util.js286
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js298
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js408
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/worker.js193
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/src/worker_loader.js53
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/bookmark.svg661
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/document-print.svg532
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/download.svg619
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/go-down.svg200
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/go-up.svg196
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/nav-outline.svg202
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/nav-thumbs.svg283
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/zoom-in.svg436
-rwxr-xr-xapps/files_pdfviewer/js/pdfjs/web/images/zoom-out.svg424
-rwxr-xr-xapps/files_pdfviewer/js/pdfview.js737
-rwxr-xr-xapps/files_pdfviewer/js/viewer.js46
-rw-r--r--apps/files_sharing/ajax/getitem.php1
-rw-r--r--apps/files_sharing/sharedstorage.php24
-rw-r--r--apps/gallery/ajax/galleryOp.php29
-rw-r--r--apps/gallery/ajax/getAlbums.php4
-rw-r--r--apps/gallery/ajax/scanForAlbums.php4
-rw-r--r--apps/gallery/appinfo/app.php3
-rw-r--r--apps/gallery/appinfo/database.xml6
-rw-r--r--apps/gallery/appinfo/info.xml7
-rw-r--r--apps/gallery/css/styles.css44
-rw-r--r--apps/gallery/index.php6
-rw-r--r--apps/gallery/js/album_cover.js40
-rw-r--r--apps/gallery/js/albums.js32
-rw-r--r--apps/gallery/lib/album.php36
-rw-r--r--apps/gallery/lib/hooks_handlers.php91
-rw-r--r--apps/gallery/lib/images_utils.php43
-rw-r--r--apps/gallery/lib/photo.php17
-rw-r--r--apps/gallery/lib/scanner.php32
-rw-r--r--apps/gallery/templates/index.php5
-rw-r--r--apps/gallery/templates/view_album.php3
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.as415
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.flabin0 -> 61952 bytes
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jplayer.playlist.js452
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jquery.jplayer.inspector.js331
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerEvent.as69
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp3.as328
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp4.as413
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerStatus.as101
-rw-r--r--apps/media/js/jQuery.jPlayer.2.1.0.source/jquery.jplayer.js2349
-rw-r--r--apps/media/lib_collection.php8
-rw-r--r--apps/media/lib_scanner.php15
-rw-r--r--apps/user_webfinger/appinfo/install.php2
-rwxr-xr-xcore/js/jquery.infieldlabel.js140
-rw-r--r--core/js/setup.js4
-rw-r--r--core/lostpassword/index.php2
-rw-r--r--files/ajax/move.php2
-rw-r--r--files/ajax/newfolder.php2
-rw-r--r--files/ajax/upload.php3
-rw-r--r--files/index.php3
-rw-r--r--files/js/fileactions.js2
-rw-r--r--files/js/filelist.js4
-rw-r--r--files/templates/index.php63
-rw-r--r--files/templates/part.list.php10
-rw-r--r--index.php19
-rw-r--r--lib/app.php11
-rw-r--r--lib/base.php37
-rw-r--r--lib/db.php2
-rw-r--r--lib/filestorage/local.php2
-rw-r--r--lib/filesystem.php56
-rw-r--r--lib/image.php554
-rw-r--r--lib/ocsclient.php27
-rw-r--r--lib/setup.php2
-rw-r--r--lib/user.php5
-rw-r--r--lib/util.php4
-rw-r--r--settings/apps.php32
-rw-r--r--settings/js/users.js2
168 files changed, 66574 insertions, 659 deletions
diff --git a/.htaccess b/.htaccess
index 0d334503d07..86a2de6b946 100644
--- a/.htaccess
+++ b/.htaccess
@@ -2,8 +2,11 @@ ErrorDocument 404 /core/templates/404.php
<IfModule mod_php5.c>
php_value upload_max_filesize 512M
php_value post_max_size 512M
+php_value memory_limit 512M
SetEnv htaccessWorking true
</IfModule>
+<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
+</IfModule>
Options -Indexes
diff --git a/3rdparty/Sabre/LICENCE b/3rdparty/Sabre/LICENCE
new file mode 100644
index 00000000000..3d07eaace83
--- /dev/null
+++ b/3rdparty/Sabre/LICENCE
@@ -0,0 +1,27 @@
+Copyright (C) 2007-2011 Rooftop Solutions.
+Copyright (C) 2007-2009 FileMobile inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the SabreDAV nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
diff --git a/3rdparty/when/When.php b/3rdparty/when/When.php
index 5f97f0eb9bf..f8bb9db0f67 100755
--- a/3rdparty/when/When.php
+++ b/3rdparty/when/When.php
@@ -586,7 +586,7 @@ class When
}
}
}
- elseif($this->gobyday || $interval == "month")
+ elseif($this->gobyday && $interval == "month")
{
$_mdays = range(1, date('t',mktime(0,0,0,$month,1,$year)));
foreach($_mdays as $_mday)
@@ -621,7 +621,7 @@ class When
if($interval == "month")
{
- $this->try_date->modify('last day of ' . $this->interval . ' ' . $interval);
+ $this->try_date->modify('+1 month');
}
else
{
diff --git a/apps/admin_export/appinfo/info.xml b/apps/admin_export/appinfo/info.xml
index c4a2a9b398c..df8a07c2f5b 100644
--- a/apps/admin_export/appinfo/info.xml
+++ b/apps/admin_export/appinfo/info.xml
@@ -7,4 +7,5 @@
<licence>AGPL</licence>
<author>Thomas Schmidt</author>
<require>2</require>
+ <default_enable/>
</info>
diff --git a/apps/calendar/ajax/activation.php b/apps/calendar/ajax/activation.php
index 72882496ab6..ada2e44547b 100644
--- a/apps/calendar/ajax/activation.php
+++ b/apps/calendar/ajax/activation.php
@@ -7,13 +7,12 @@
*/
require_once ("../../../lib/base.php");
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$calendarid = $_POST['calendarid'];
+$calendar = OC_Calendar_App::getCalendar($calendarid);//access check
OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']);
-$calendar = OC_Calendar_Calendar::findCalendar($calendarid);
+$calendar = OC_Calendar_App::getCalendar($calendarid);
OC_JSON::success(array(
'active' => $calendar['active'],
'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar),
diff --git a/apps/calendar/ajax/choosecalendar.php b/apps/calendar/ajax/choosecalendar.php
index 0935a4c42ad..9281c8edbdc 100644
--- a/apps/calendar/ajax/choosecalendar.php
+++ b/apps/calendar/ajax/choosecalendar.php
@@ -8,9 +8,7 @@
require_once('../../../lib/base.php');
$l10n = new OC_L10N('calendar');
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$output = new OC_TEMPLATE("calendar", "part.choosecalendar");
$output -> printpage();
diff --git a/apps/calendar/ajax/createcalendar.php b/apps/calendar/ajax/createcalendar.php
index 325a5ec35bc..f8b5974f54c 100644
--- a/apps/calendar/ajax/createcalendar.php
+++ b/apps/calendar/ajax/createcalendar.php
@@ -8,8 +8,6 @@
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-
// Check if we are a user
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
@@ -17,7 +15,8 @@ OC_JSON::checkAppEnabled('calendar');
$userid = OC_User::getUser();
$calendarid = OC_Calendar_Calendar::addCalendar($userid, $_POST['name'], 'VEVENT,VTODO,VJOURNAL', null, 0, $_POST['color']);
OC_Calendar_Calendar::setCalendarActive($calendarid, 1);
-$calendar = OC_Calendar_Calendar::findCalendar($calendarid);
+
+$calendar = OC_Calendar_Calendar::find($calendarid);
$tmpl = new OC_Template('calendar', 'part.choosecalendar.rowfields');
$tmpl->assign('calendar', $calendar);
OC_JSON::success(array(
diff --git a/apps/calendar/ajax/daysofweekend.php b/apps/calendar/ajax/daysofweekend.php
deleted file mode 100755
index 606d13b1e1c..00000000000
--- a/apps/calendar/ajax/daysofweekend.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-echo OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'weekend', '{"Monday":"false","Tuesday":"false","Wednesday":"false","Thursday":"false","Friday":"false","Saturday":"true","Sunday":"true"}');
-?>
diff --git a/apps/calendar/ajax/deletecalendar.php b/apps/calendar/ajax/deletecalendar.php
index e8ffe0d0598..901cbbfcb08 100644
--- a/apps/calendar/ajax/deletecalendar.php
+++ b/apps/calendar/ajax/deletecalendar.php
@@ -7,19 +7,11 @@
*/
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-
-if(!OC_USER::isLoggedIn()) {
- die('<script type="text/javascript">document.location = oc_webroot;</script>');
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$cal = $_POST["calendarid"];
-$calendar = OC_Calendar_Calendar::findCalendar($cal);
-if($calendar["userid"] != OC_User::getUser()){
- OC_JSON::error(array('error'=>'permission_denied'));
- exit;
-}
+$calendar = OC_Calendar_App::getCalendar($cal);
$del = OC_Calendar_Calendar::deleteCalendar($cal);
if($del == true){
OC_JSON::success();
diff --git a/apps/calendar/ajax/deleteevent.php b/apps/calendar/ajax/deleteevent.php
index 9e3c7dd87dd..b25a5af1a29 100644
--- a/apps/calendar/ajax/deleteevent.php
+++ b/apps/calendar/ajax/deleteevent.php
@@ -9,23 +9,11 @@ require_once('../../../lib/base.php');
$l10n = new OC_L10N('calendar');
-if(!OC_USER::isLoggedIn()) {
- die('<script type="text/javascript">document.location = oc_webroot;</script>');
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$id = $_POST['id'];
-$data = OC_Calendar_Object::find($id);
-if (!$data)
-{
- OC_JSON::error();
- exit;
-}
-$calendar = OC_Calendar_Calendar::findCalendar($data['calendarid']);
-if($calendar['userid'] != OC_User::getUser()){
- OC_JSON::error();
- exit;
-}
+$event_object = OC_Calendar_App::getEventObject($id);
$result = OC_Calendar_Object::delete($id);
OC_JSON::success();
?>
diff --git a/apps/calendar/ajax/duration.php b/apps/calendar/ajax/duration.php
deleted file mode 100644
index cdc41388abd..00000000000
--- a/apps/calendar/ajax/duration.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-$duration = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'duration', "60");
-OC_JSON::encodedPrint(array("duration" => $duration));
-?>
diff --git a/apps/calendar/ajax/editcalendar.php b/apps/calendar/ajax/editcalendar.php
index d23e5287868..7aeb5bbe305 100644
--- a/apps/calendar/ajax/editcalendar.php
+++ b/apps/calendar/ajax/editcalendar.php
@@ -7,13 +7,11 @@
*/
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
+
$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions();
-$calendar = OC_Calendar_Calendar::findCalendar($_GET['calendarid']);
+$calendar = OC_Calendar_App::getCalendar($_GET['calendarid']);
$tmpl = new OC_Template("calendar", "part.editcalendar");
$tmpl->assign('new', false);
$tmpl->assign('calendarcolor_options', $calendarcolor_options);
diff --git a/apps/calendar/ajax/editevent.php b/apps/calendar/ajax/editevent.php
index e3c84520481..5a487da1758 100644
--- a/apps/calendar/ajax/editevent.php
+++ b/apps/calendar/ajax/editevent.php
@@ -7,12 +7,7 @@
*/
require_once('../../../lib/base.php');
-
-$l10n = new OC_L10N('calendar');
-
-if(!OC_USER::isLoggedIn()) {
- die('<script type="text/javascript">document.location = oc_webroot;</script>');
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$errarr = OC_Calendar_Object::validateRequest($_POST);
@@ -23,26 +18,12 @@ if($errarr){
}else{
$id = $_POST['id'];
$cal = $_POST['calendar'];
- $data = OC_Calendar_Object::find($id);
- if (!$data)
- {
- OC_JSON::error();
- exit;
- }
- $calendar = OC_Calendar_Calendar::findCalendar($data['calendarid']);
- if($calendar['userid'] != OC_User::getUser()){
- OC_JSON::error();
- exit;
- }
+ $data = OC_Calendar_App::getEventObject($id);
$vcalendar = OC_VObject::parse($data['calendardata']);
- $last_modified = $vcalendar->VEVENT->__get('LAST-MODIFIED');
- if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){
- OC_JSON::error(array('modified'=>true));
- exit;
- }
-
+ OC_Calendar_App::isNotModified($vcalendar->VEVENT, $_POST['lastmodified']);
OC_Calendar_Object::updateVCalendarFromRequest($_POST, $vcalendar);
+
$result = OC_Calendar_Object::edit($id, $vcalendar->serialize());
if ($data['calendarid'] != $cal) {
OC_Calendar_Object::moveToCalendar($id, $cal);
diff --git a/apps/calendar/ajax/editeventform.php b/apps/calendar/ajax/editeventform.php
index c91f136e898..95cae39c1c2 100644
--- a/apps/calendar/ajax/editeventform.php
+++ b/apps/calendar/ajax/editeventform.php
@@ -8,26 +8,16 @@
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-
if(!OC_USER::isLoggedIn()) {
die('<script type="text/javascript">document.location = oc_webroot;</script>');
}
OC_JSON::checkAppEnabled('calendar');
-$calendar_options = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
-$category_options = OC_Calendar_Object::getCategoryOptions($l10n);
-$repeat_options = OC_Calendar_Object::getRepeatOptions($l10n);
-
$id = $_GET['id'];
-$data = OC_Calendar_Object::find($id);
-$calendar = OC_Calendar_Calendar::findCalendar($data['calendarid']);
-if($calendar['userid'] != OC_User::getUser()){
- echo $l10n->t('Wrong calendar');
- exit;
-}
+$data = OC_Calendar_App::getEventObject($id);
$object = OC_VObject::parse($data['calendardata']);
$vevent = $object->VEVENT;
+
$dtstart = $vevent->DTSTART;
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
switch($dtstart->getDateType()) {
@@ -52,7 +42,6 @@ switch($dtstart->getDateType()) {
$summary = $vevent->getAsString('SUMMARY');
$location = $vevent->getAsString('LOCATION');
$categories = $vevent->getAsArray('CATEGORIES');
-$repeat = $vevent->getAsString('CATEGORY');
$description = $vevent->getAsString('DESCRIPTION');
foreach($categories as $category){
if (!in_array($category, $category_options)){
@@ -65,6 +54,150 @@ if ($last_modified){
}else{
$lastmodified = 0;
}
+if($data['repeating'] == 1){
+ $rrule = explode(';', $vevent->getAsString('RRULE'));
+ $rrulearr = array();
+ foreach($rrule as $rule){
+ list($attr, $val) = explode('=', $rule);
+ $rrulearr[$attr] = $val;
+ }
+ if(!isset($rrulearr['INTERVAL']) || $rrulearr['INTERVAL'] == ''){
+ $rrulearr['INTERVAL'] = 1;
+ }
+ if(array_key_exists('BYDAY', $rrulearr)){
+ if(substr_count($rrulearr['BYDAY'], ',') == 0){
+ if(strlen($rrulearr['BYDAY']) == 2){
+ $repeat['weekdays'] = array($rrulearr['BYDAY']);
+ }elseif(strlen($rrulearr['BYDAY']) == 3){
+ $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 1);
+ $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 1, 2));
+ }elseif(strlen($rrulearr['BYDAY']) == 4){
+ $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 2);
+ $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 2, 2));
+ }
+ }else{
+ $byday_days = explode(',', $rrulearr['BYDAY']);
+ foreach($byday_days as $byday_day){
+ if(strlen($byday_day) == 2){
+ $repeat['weekdays'][] = $byday_day;
+ }elseif(strlen($byday_day) == 3){
+ $repeat['weekofmonth'] = substr($byday_day , 0, 1);
+ $repeat['weekdays'][] = substr($byday_day , 1, 2);
+ }elseif(strlen($byday_day) == 4){
+ $repeat['weekofmonth'] = substr($byday_day , 0, 2);
+ $repeat['weekdays'][] = substr($byday_day , 2, 2);
+ }
+ }
+ }
+ }
+ if(array_key_exists('BYMONTHDAY', $rrulearr)){
+ if(substr_count($rrulearr['BYMONTHDAY'], ',') == 0){
+ $repeat['bymonthday'][] = $rrulearr['BYMONTHDAY'];
+ }else{
+ $bymonthdays = explode(',', $rrulearr['BYMONTHDAY']);
+ foreach($bymonthdays as $bymonthday){
+ $repeat['bymonthday'][] = $bymonthday;
+ }
+ }
+ }
+ if(array_key_exists('BYYEARDAY', $rrulearr)){
+ if(substr_count($rrulearr['BYYEARDAY'], ',') == 0){
+ $repeat['byyearday'][] = $rrulearr['BYYEARDAY'];
+ }else{
+ $byyeardays = explode(',', $rrulearr['BYYEARDAY']);
+ foreach($byyeardays as $yearday){
+ $repeat['byyearday'][] = $yearday;
+ }
+ }
+ }
+ if(array_key_exists('BYWEEKNO', $rrulearr)){
+ if(substr_count($rrulearr['BYWEEKNO'], ',') == 0){
+ $repeat['byweekno'][] = (string) $rrulearr['BYWEEKNO'];
+ }else{
+ $byweekno = explode(',', $rrulearr['BYWEEKNO']);
+ foreach($byweekno as $weekno){
+ $repeat['byweekno'][] = (string) $weekno;
+ }
+ }
+ }
+ if(array_key_exists('BYMONTH', $rrulearr)){
+ $months = OC_Calendar_App::getByMonthOptions();
+ if(substr_count($rrulearr['BYMONTH'], ',') == 0){
+ $repeat['bymonth'][] = $months[$month];
+ }else{
+ $bymonth = explode(',', $rrulearr['BYMONTH']);
+ foreach($bymonth as $month){
+ $repeat['bymonth'][] = $months[$month];
+ }
+ }
+ }
+ switch($rrulearr['FREQ']){
+ case 'DAILY':
+ $repeat['repeat'] = 'daily';
+ break;
+ case 'WEEKLY':
+ if($rrulearr['INTERVAL'] % 2 == 0){
+ $repeat['repeat'] = 'biweekly';
+ $rrulearr['INTERVAL'] = $rrulearr['INTERVAL'] / 2;
+ }elseif($rrulearr['BYDAY'] == 'MO,TU,WE,TH,FR'){
+ $repeat['repeat'] = 'weekday';
+ }else{
+ $repeat['repeat'] = 'weekly';
+ }
+ break;
+ case 'MONTHLY':
+ $repeat['repeat'] = 'monthly';
+ if(array_key_exists('BYDAY', $rrulearr)){
+ $repeat['month'] = 'weekday';
+ }else{
+ $repeat['month'] = 'monthday';
+ }
+ break;
+ case 'YEARLY':
+ $repeat['repeat'] = 'yearly';
+ if(array_key_exists('BYMONTH', $rrulearr)){
+ $repeat['year'] = 'bydaymonth';
+ }elseif(array_key_exists('BYWEEKNO', $rrulearr)){
+ $repeat['year'] = 'byweekno';
+ }else{
+ $repeat['year'] = 'byyearday';
+ }
+ }
+ $repeat['interval'] = $rrulearr['INTERVAL'];
+ if(array_key_exists('COUNT', $rrulearr)){
+ $repeat['end'] = 'count';
+ $repeat['count'] = $rrulearr['COUNT'];
+ }elseif(array_key_exists('UNTIL', $rrulearr)){
+ $repeat['end'] = 'date';
+ $endbydate_day = substr($rrulearr['UNTIL'], 6, 2);
+ $endbydate_month = substr($rrulearr['UNTIL'], 4, 2);
+ $endbydate_year = substr($rrulearr['UNTIL'], 0, 4);
+ $repeat['date'] = $endbydate_day . '-' . $endbydate_month . '-' . $endbydate_year;
+ }else{
+ $repeat['end'] = 'never';
+ }
+ if(array_key_exists('weekdays', $repeat)){
+ $repeat_weekdays_ = array();
+ $days = OC_Calendar_App::getWeeklyOptions();
+ foreach($repeat['weekdays'] as $weekday){
+ $repeat_weekdays_[] = $days[$weekday];
+ }
+ $repeat['weekdays'] = $repeat_weekdays_;
+ }
+}
+
+$calendar_options = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
+$category_options = OC_Calendar_App::getCategoryOptions();
+$repeat_options = OC_Calendar_App::getRepeatOptions();
+$repeat_end_options = OC_Calendar_App::getEndOptions();
+$repeat_month_options = OC_Calendar_App::getMonthOptions();
+$repeat_year_options = OC_Calendar_App::getYearOptions();
+$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions();
+$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth();
+$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions();
+$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions();
+$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions();
+$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions();
$tmpl = new OC_Template('calendar', 'part.editevent');
$tmpl->assign('id', $id);
@@ -72,6 +205,15 @@ $tmpl->assign('lastmodified', $lastmodified);
$tmpl->assign('calendar_options', $calendar_options);
$tmpl->assign('category_options', $category_options);
$tmpl->assign('repeat_options', $repeat_options);
+$tmpl->assign('repeat_month_options', $repeat_month_options);
+$tmpl->assign('repeat_weekly_options', $repeat_weekly_options);
+$tmpl->assign('repeat_end_options', $repeat_end_options);
+$tmpl->assign('repeat_year_options', $repeat_year_options);
+$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options);
+$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options);
+$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options);
+$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options);
+$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options);
$tmpl->assign('title', $summary);
$tmpl->assign('location', $location);
@@ -82,8 +224,22 @@ $tmpl->assign('startdate', $startdate);
$tmpl->assign('starttime', $starttime);
$tmpl->assign('enddate', $enddate);
$tmpl->assign('endtime', $endtime);
-$tmpl->assign('repeat', $repeat);
$tmpl->assign('description', $description);
+
+$tmpl->assign('repeat', $repeat['repeat']);
+$tmpl->assign('repeat_month', $repeat['month']);
+$tmpl->assign('repeat_weekdays', $repeat['weekdays']);
+$tmpl->assign('repeat_interval', $repeat['interval']);
+$tmpl->assign('repeat_end', $repeat['end']);
+$tmpl->assign('repeat_count', $repeat['count']);
+$tmpl->assign('repeat_weekofmonth', $repeat['weekofmonth']);
+$tmpl->assign('repeat_date', $repeat['date']);
+$tmpl->assign('repeat_year', $repeat['year']);
+$tmpl->assign('repeat_byyearday', $repeat['byyearday']);
+$tmpl->assign('repeat_bymonthday', $repeat['bymonthday']);
+$tmpl->assign('repeat_bymonth', $repeat['bymonth']);
+$tmpl->assign('repeat_byweekno', $repeat['byweekno']);
$tmpl->printpage();
+
?>
diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php
index 1430432b8a3..998991c2fb4 100644
--- a/apps/calendar/ajax/events.php
+++ b/apps/calendar/ajax/events.php
@@ -58,7 +58,7 @@ foreach($events as $event){
}
if($return_event['allDay'] == true){
$return_event['start'] = $result->format('Y-m-d');
- $return_event['end'] = date('Y-m-d', $result->format('U') + $duration--);
+ $return_event['end'] = date('Y-m-d', $result->format('U') + --$duration);
}else{
$return_event['start'] = $result->format('Y-m-d H:i:s');
$return_event['end'] = date('Y-m-d H:i:s', $result->format('U') + $duration);
diff --git a/apps/calendar/ajax/firstdayofweek.php b/apps/calendar/ajax/firstdayofweek.php
deleted file mode 100755
index eff82cece1d..00000000000
--- a/apps/calendar/ajax/firstdayofweek.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-$firstdayofweek = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'firstdayofweek', "1");
-OC_JSON::encodedPrint(array("firstdayofweek" => $firstdayofweek));
-?> \ No newline at end of file
diff --git a/apps/calendar/ajax/gettimezonedetection.php b/apps/calendar/ajax/gettimezonedetection.php
new file mode 100644
index 00000000000..ae58370712d
--- /dev/null
+++ b/apps/calendar/ajax/gettimezonedetection.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Copyright (c) 2011, 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+require_once ("../../../lib/base.php");
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('calendar');
+OC_JSON::success(array('detection' => OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezonedetection'))); \ No newline at end of file
diff --git a/apps/calendar/ajax/guesstimezone.php b/apps/calendar/ajax/guesstimezone.php
index a3594498b0f..41aea26985f 100755
--- a/apps/calendar/ajax/guesstimezone.php
+++ b/apps/calendar/ajax/guesstimezone.php
@@ -1,6 +1,6 @@
<?php
/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
+ * Copyright (c) 2011, 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
@@ -24,11 +24,20 @@ OC_JSON::checkAppEnabled('calendar');
$l = new OC_L10N('calendar');
$lat = $_GET['lat'];
$long = $_GET['long'];
+if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'position') == $lat . '-' . $long && OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone') != null){
+ OC_JSON::success();
+ exit;
+}
+OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'position', $lat . '-' . $long);
$geolocation = file_get_contents('http://ws.geonames.org/timezone?lat=' . $lat . '&lng=' . $long);
//Information are by Geonames (http://www.geonames.org) and licensed under the Creative Commons Attribution 3.0 License
$geoxml = simplexml_load_string($geolocation);
$geoarray = make_array_out_of_xml($geoxml);
-if(isset($geoarray['timezone']['timezoneId']) && $geoarray['timezone']['timezoneId'] != ''){
+if($geoarray['timezone']['timezoneId'] == OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone')){
+ OC_JSON::success();
+ exit;
+}
+if(in_array($geoarray['timezone']['timezoneId'], DateTimeZone::listIdentifiers())){
OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezone', $geoarray['timezone']['timezoneId']);
$message = array('message'=> $l->t('New Timezone:') . $geoarray['timezone']['timezoneId']);
OC_JSON::success($message);
@@ -36,4 +45,4 @@ if(isset($geoarray['timezone']['timezoneId']) && $geoarray['timezone']['timezone
OC_JSON::error();
}
-?> \ No newline at end of file
+?>
diff --git a/apps/calendar/ajax/importdialog.php b/apps/calendar/ajax/importdialog.php
index 232b4ba5807..983a3d95a84 100644
--- a/apps/calendar/ajax/importdialog.php
+++ b/apps/calendar/ajax/importdialog.php
@@ -11,7 +11,7 @@ require_once('../../../lib/base.php');
$l10n = new OC_L10N('calendar');
if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
+ die('<script type="text/javascript">document.location = oc_webroot;</script>');
}
OC_JSON::checkAppEnabled('calendar');
diff --git a/apps/calendar/ajax/moveevent.php b/apps/calendar/ajax/moveevent.php
index 51fafdfeb97..f2256d4eee6 100644
--- a/apps/calendar/ajax/moveevent.php
+++ b/apps/calendar/ajax/moveevent.php
@@ -5,31 +5,20 @@
* later.
* See the COPYING-README file.
*/
-error_reporting(E_ALL);
require_once('../../../lib/base.php');
OC_JSON::checkLoggedIn();
-$data = OC_Calendar_Object::find($_POST["id"]);
-$calendarid = $data["calendarid"];
-$cal = $calendarid;
+
$id = $_POST['id'];
-$calendar = OC_Calendar_Calendar::findCalendar($calendarid);
-if(OC_User::getUser() != $calendar['userid']){
- OC_JSON::error();
- exit;
-}
+
+$vcalendar = OC_Calendar_App::getVCalendar($id);
+$vevent = $vcalendar->VEVENT;
+
$allday = $_POST['allDay'];
$delta = new DateInterval('P0D');
$delta->d = $_POST['dayDelta'];
$delta->i = $_POST['minuteDelta'];
-$vcalendar = OC_VObject::parse($data['calendardata']);
-$vevent = $vcalendar->VEVENT;
-
-$last_modified = $vevent->__get('LAST-MODIFIED');
-if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){
- OC_JSON::error();
- exit;
-}
+OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']);
$dtstart = $vevent->DTSTART;
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
@@ -50,4 +39,5 @@ $vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Element_DateTime::UTC
$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Element_DateTime::UTC);
$result = OC_Calendar_Object::edit($id, $vcalendar->serialize());
-OC_JSON::success(array('lastmodified'=>(int)$now->format('U')));
+$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime();
+OC_JSON::success(array('lastmodified'=>(int)$lastmodified->format('U')));
diff --git a/apps/calendar/ajax/newcalendar.php b/apps/calendar/ajax/newcalendar.php
index a7935c95672..af3ba4fbbea 100644
--- a/apps/calendar/ajax/newcalendar.php
+++ b/apps/calendar/ajax/newcalendar.php
@@ -8,9 +8,7 @@
require_once('../../../lib/base.php');
$l10n = new OC_L10N('calendar');
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions();
$calendar = array(
diff --git a/apps/calendar/ajax/newevent.php b/apps/calendar/ajax/newevent.php
index 1a696cf7780..c7c4d29943a 100644
--- a/apps/calendar/ajax/newevent.php
+++ b/apps/calendar/ajax/newevent.php
@@ -10,9 +10,7 @@ require_once('../../../lib/base.php');
$l10n = new OC_L10N('calendar');
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
-}
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$errarr = OC_Calendar_Object::validateRequest($_POST);
diff --git a/apps/calendar/ajax/neweventform.php b/apps/calendar/ajax/neweventform.php
index 68423adb344..3870c879b0e 100644
--- a/apps/calendar/ajax/neweventform.php
+++ b/apps/calendar/ajax/neweventform.php
@@ -8,8 +8,6 @@
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-
if(!OC_USER::isLoggedIn()) {
die('<script type="text/javascript">document.location = oc_webroot;</script>');
}
@@ -34,16 +32,45 @@ $start->setTimezone(new DateTimeZone($timezone));
$end->setTimezone(new DateTimeZone($timezone));
$calendar_options = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
-$category_options = OC_Calendar_Object::getCategoryOptions($l10n);
-$repeat_options = OC_Calendar_Object::getRepeatOptions($l10n);
+$category_options = OC_Calendar_App::getCategoryOptions();
+$repeat_options = OC_Calendar_App::getRepeatOptions();
+$repeat_end_options = OC_Calendar_App::getEndOptions();
+$repeat_month_options = OC_Calendar_App::getMonthOptions();
+$repeat_year_options = OC_Calendar_App::getYearOptions();
+$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions();
+$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth();
+$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions();
+$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions();
+$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions();
+$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions();
$tmpl = new OC_Template('calendar', 'part.newevent');
$tmpl->assign('calendar_options', $calendar_options);
$tmpl->assign('category_options', $category_options);
+$tmpl->assign('repeat_options', $repeat_options);
+$tmpl->assign('repeat_month_options', $repeat_month_options);
+$tmpl->assign('repeat_weekly_options', $repeat_weekly_options);
+$tmpl->assign('repeat_end_options', $repeat_end_options);
+$tmpl->assign('repeat_year_options', $repeat_year_options);
+$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options);
+$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options);
+$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options);
+$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options);
+$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options);
+
$tmpl->assign('startdate', $start->format('d-m-Y'));
$tmpl->assign('starttime', $start->format('H:i'));
$tmpl->assign('enddate', $end->format('d-m-Y'));
$tmpl->assign('endtime', $end->format('H:i'));
$tmpl->assign('allday', $allday);
+$tmpl->assign('repeat', 'doesnotrepeat');
+$tmpl->assign('repeat_month', 'monthday');
+$tmpl->assign('repeat_weekdays', array());
+$tmpl->assign('repeat_interval', 1);
+$tmpl->assign('repeat_end', 'never');
+$tmpl->assign('repeat_count', '10');
+$tmpl->assign('repeat_weekofmonth', 'auto');
+$tmpl->assign('repeat_date', '');
+$tmpl->assign('repeat_year', 'bydate');
$tmpl->printpage();
?>
diff --git a/apps/calendar/ajax/resizeevent.php b/apps/calendar/ajax/resizeevent.php
index 28a185411e0..68347906529 100644
--- a/apps/calendar/ajax/resizeevent.php
+++ b/apps/calendar/ajax/resizeevent.php
@@ -5,45 +5,28 @@
* later.
* See the COPYING-README file.
*/
-error_reporting(E_ALL);
require_once('../../../lib/base.php');
OC_JSON::checkLoggedIn();
-$data = OC_Calendar_Object::find($_POST["id"]);
-$calendarid = $data["calendarid"];
-$cal = $calendarid;
+
$id = $_POST['id'];
-$calendar = OC_Calendar_Calendar::findCalendar($calendarid);
-if(OC_User::getUser() != $calendar['userid']){
- OC_JSON::error();
- exit;
-}
+
+$vcalendar = OC_Calendar_App::getVCalendar($id);
+$vevent = $vcalendar->VEVENT;
$delta = new DateInterval('P0D');
$delta->d = $_POST['dayDelta'];
$delta->i = $_POST['minuteDelta'];
-$vcalendar = OC_Calendar_Object::parse($data['calendardata']);
-$vevent = $vcalendar->VEVENT;
-
-$last_modified = $vevent->__get('LAST-MODIFIED');
-if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){
- OC_JSON::error();
- exit;
-}
+OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']);
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
$end_type = $dtend->getDateType();
$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type);
unset($vevent->DURATION);
-$now = new DateTime();
-$last_modified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED');
-$last_modified->setDateTime($now, Sabre_VObject_Element_DateTime::UTC);
-$vevent->__set('LAST-MODIFIED', $last_modified);
-
-$dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP');
-$dtstamp->setDateTime($now, Sabre_VObject_Element_DateTime::UTC);
-$vevent->DTSTAMP = $dtstamp;
+$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Element_DateTime::UTC);
+$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Element_DateTime::UTC);
$result = OC_Calendar_Object::edit($id, $vcalendar->serialize());
-OC_JSON::success(array('lastmodified'=>$now->format('U')));
+$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime();
+OC_JSON::success(array('lastmodified'=>(int)$lastmodified->format('U')));
diff --git a/apps/calendar/ajax/setdaysofweekend.php b/apps/calendar/ajax/setdaysofweekend.php
deleted file mode 100755
index b5ef5f8573f..00000000000
--- a/apps/calendar/ajax/setdaysofweekend.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-$weekenddays = array("Monday"=>"false", "Tuesday"=>"false", "Wednesday"=>"false", "Thursday"=>"false", "Friday"=>"false", "Saturday"=>"false", "Sunday"=>"false");
-for($i = 0;$i < count($_POST["weekend"]); $i++){
- switch ($_POST["weekend"][$i]){
- case "Monday":
- case "Tuesday":
- case "Wednesday":
- case "Thursday":
- case "Friday":
- case "Saturday":
- case "Sunday":
- break;
- default:
- OC_JSON::error();
- exit;
- }
- $weekenddays[$_POST["weekend"][$i]] = "true";
-}
-$setValue = json_encode($weekenddays);
-OC_Preferences::setValue(OC_User::getUser(), 'calendar', 'weekend', $setValue);
-OC_JSON::success();
-?>
diff --git a/apps/calendar/ajax/setduration.php b/apps/calendar/ajax/setduration.php
deleted file mode 100644
index a75c8faea42..00000000000
--- a/apps/calendar/ajax/setduration.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-if(isset($_POST["duration"])){
- OC_Preferences::setValue(OC_User::getUser(), 'calendar', 'duration', $_POST["duration"]);
- OC_JSON::success();
-}else{
- OC_JSON::error();
-}
-?>
-
diff --git a/apps/calendar/ajax/setfirstdayofweek.php b/apps/calendar/ajax/setfirstdayofweek.php
deleted file mode 100755
index 571b95af0e3..00000000000
--- a/apps/calendar/ajax/setfirstdayofweek.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-require_once('../../../lib/base.php');
-OC_JSON::checkLoggedIn();
-if(isset($_POST["firstdayofweek"])){
- OC_Preferences::setValue(OC_User::getUser(), 'calendar', 'firstdayofweek', $_POST["firstdayofweek"]);
- OC_JSON::success();
-}else{
- OC_JSON::error();
-}
-?>
diff --git a/apps/calendar/ajax/timezonedetection.php b/apps/calendar/ajax/timezonedetection.php
new file mode 100644
index 00000000000..77e4c4f6ebe
--- /dev/null
+++ b/apps/calendar/ajax/timezonedetection.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Copyright (c) 2011, 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+require_once ("../../../lib/base.php");
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('calendar');
+if($_POST['timezonedetection'] == 'on'){
+ OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezonedetection', 'true');
+}else{
+ OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezonedetection', 'false');
+}
+OC_JSON::success();
+
diff --git a/apps/calendar/ajax/updatecalendar.php b/apps/calendar/ajax/updatecalendar.php
index e99ca16e22a..14f560da5a3 100644
--- a/apps/calendar/ajax/updatecalendar.php
+++ b/apps/calendar/ajax/updatecalendar.php
@@ -8,16 +8,16 @@
require_once('../../../lib/base.php');
-$l10n = new OC_L10N('calendar');
-
// Check if we are a user
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$calendarid = $_POST['id'];
+$calendar = OC_Calendar_App::getCalendar($calendarid);//access check
OC_Calendar_Calendar::editCalendar($calendarid, $_POST['name'], null, null, null, $_POST['color']);
OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']);
-$calendar = OC_Calendar_Calendar::findCalendar($calendarid);
+
+$calendar = OC_Calendar_App::getCalendar($calendarid);
$tmpl = new OC_Template('calendar', 'part.choosecalendar.rowfields');
$tmpl->assign('calendar', $calendar);
OC_JSON::success(array(
diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php
index 5675e624dda..267a74bf29a 100644
--- a/apps/calendar/appinfo/app.php
+++ b/apps/calendar/appinfo/app.php
@@ -1,25 +1,23 @@
<?php
-$l=new OC_L10N('calendar');
-OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php';
-OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php';
-OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php';
-OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php';
-OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Calendar_Hooks', 'deleteUser');
-
-OC_Util::addScript('calendar','loader');
-
-OC_App::register( array(
- 'order' => 10,
- 'id' => 'calendar',
- 'name' => 'Calendar' ));
-
-OC_App::addNavigationEntry( array(
- 'id' => 'calendar_index',
- 'order' => 10,
- 'href' => OC_Helper::linkTo( 'calendar', 'index.php' ),
- 'icon' => OC_Helper::imagePath( 'calendar', 'icon.png' ),
- 'name' => $l->t('Calendar')));
-
-OC_App::registerPersonal('calendar', 'settings');
-
-require_once('apps/calendar/lib/search.php'); \ No newline at end of file
+if(version_compare(PHP_VERSION, '5.3.0', '>')){
+ $l=new OC_L10N('calendar');
+ OC::$CLASSPATH['OC_Calendar_App'] = 'apps/calendar/lib/app.php';
+ OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php';
+ OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php';
+ OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php';
+ OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php';
+ OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Calendar_Hooks', 'deleteUser');
+ OC_Util::addScript('calendar','loader');
+ OC_App::register( array(
+ 'order' => 10,
+ 'id' => 'calendar',
+ 'name' => 'Calendar' ));
+ OC_App::addNavigationEntry( array(
+ 'id' => 'calendar_index',
+ 'order' => 10,
+ 'href' => OC_Helper::linkTo( 'calendar', 'index.php' ),
+ 'icon' => OC_Helper::imagePath( 'calendar', 'icon.png' ),
+ 'name' => $l->t('Calendar')));
+ OC_App::registerPersonal('calendar', 'settings');
+ require_once('apps/calendar/lib/search.php');
+}
diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css
index 0204f2fc12f..6555c25a767 100644
--- a/apps/calendar/css/style.css
+++ b/apps/calendar/css/style.css
@@ -17,6 +17,8 @@
#editentry_dialog {display: none;}
#parsingfail_dialog{display: none;}
+#loading { display: none; left: 40%; position: fixed; top: 4.4em; z-index: 100; }
+
#calendar_holder {position: relative;bottom: 0; right: 0; left: 0; top: 3em;}
.fc-content{padding:2px 4px;}
#listview {margin: 0; padding: 10px; background: #EEEEEE;}
diff --git a/apps/calendar/export.php b/apps/calendar/export.php
index 3e93a1ad618..ce1a4aa046f 100644
--- a/apps/calendar/export.php
+++ b/apps/calendar/export.php
@@ -6,33 +6,25 @@
* See the COPYING-README file.
*/
-require_once ("../../lib/base.php");
+require_once ('../../lib/base.php');
OC_Util::checkLoggedIn();
OC_Util::checkAppEnabled('calendar');
-$cal = isset($_GET["calid"]) ? $_GET["calid"] : NULL;
-$event = isset($_GET["eventid"]) ? $_GET["eventid"] : NULL;
+$cal = isset($_GET['calid']) ? $_GET['calid'] : NULL;
+$event = isset($_GET['eventid']) ? $_GET['eventid'] : NULL;
if(isset($cal)){
- $calendar = OC_Calendar_Calendar::findCalendar($cal);
- if($calendar["userid"] != OC_User::getUser()){
- OC_JSON::error();
- exit;
- }
+ $calendar = OC_Calendar_App::getCalendar($cal);
$calobjects = OC_Calendar_Object::all($cal);
- header("Content-Type: text/Calendar");
- header("Content-Disposition: inline; filename=calendar.ics");
- for($i = 0;$i <= count($calobjects); $i++){
- echo $calobjects[$i]["calendardata"] . "\n";
+ header('Content-Type: text/Calendar');
+ header('Content-Disposition: inline; filename=' . $calendar['displayname'] . '.ics');
+ foreach($calobjects as $calobject){
+ echo $calobject['calendardata'] . '\n';
}
}elseif(isset($event)){
- $data = OC_Calendar_Object::find($_GET["eventid"]);
- $calendarid = $data["calendarid"];
- $calendar = OC_Calendar_Calendar::findCalendar($calendarid);
- if($calendar["userid"] != OC_User::getUser()){
- OC_JSON::error();
- exit;
- }
- header("Content-Type: text/Calendar");
- header("Content-Disposition: inline; filename=" . $data["summary"] . ".ics");
- echo $data["calendardata"];
+ $data = OC_Calendar_App::getEventObject($_GET['eventid']);
+ $calendarid = $data['calendarid'];
+ $calendar = OC_Calendar_App::getCalendar($calendarid);
+ header('Content-Type: text/Calendar');
+ header('Content-Disposition: inline; filename=' . $data['summary'] . '.ics');
+ echo $data['calendardata'];
}
?>
diff --git a/apps/calendar/import.php b/apps/calendar/import.php
index 211791f551b..759726b8d10 100644
--- a/apps/calendar/import.php
+++ b/apps/calendar/import.php
@@ -12,11 +12,7 @@ OC_Util::checkAppEnabled('calendar');
if($_GET["import"] == "existing"){
$calid = $_GET["calid"];
- $calendar = OC_Calendar_Calendar::findCalendar($calid);
- if($calendar['userid'] != OC_User::getUser()){
- OC_JSON::error();
- exit;
- }
+ $calendar = OC_Calendar_App::getCalendar($calid);
if($_GET["path"] != ""){
$filename = $_GET["path"] . "/" . $_GET["file"];
}else{
@@ -47,4 +43,4 @@ for($i = 1;$i < count($vcalendar);$i++){
OC_Calendar_Object::add($calid, $vcalendar[$i]);
}
OC_JSON::success();
-?> \ No newline at end of file
+?>
diff --git a/apps/calendar/index.php b/apps/calendar/index.php
index 3313750d52e..e8e214c0b75 100644
--- a/apps/calendar/index.php
+++ b/apps/calendar/index.php
@@ -32,7 +32,7 @@ if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'mont
OC_Util::addScript('3rdparty/fullcalendar', 'fullcalendar');
OC_Util::addStyle('3rdparty/fullcalendar', 'fullcalendar');
-if(OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone") == null){
+if(OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone") == null || OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezonedetection') == 'true'){
OC_UTIL::addScript('calendar', 'geo');
}
OC_Util::addScript('calendar', 'calendar');
@@ -42,4 +42,7 @@ OC_Util::addStyle('', 'jquery.multiselect');
OC_App::setActiveNavigationEntry('calendar_index');
$tmpl = new OC_Template('calendar', 'calendar', 'user');
$tmpl->assign('eventSources', $eventSources);
-$tmpl->printPage(); \ No newline at end of file
+if(array_key_exists('showevent', $_GET)){
+ $tmpl->assign('showevent', $_GET['showevent']);
+}
+$tmpl->printPage();
diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js
index c3644b53704..ae586661ccc 100644
--- a/apps/calendar/js/calendar.js
+++ b/apps/calendar/js/calendar.js
@@ -8,7 +8,15 @@
Calendar={
UI:{
+ loading: function(isLoading){
+ if (isLoading){
+ $('#loading').show();
+ }else{
+ $('#loading').hide();
+ }
+ },
startEventDialog:function(){
+ Calendar.UI.loading(false);
$('.tipsy').remove();
$('#calendar_holder').fullCalendar('unselect');
Calendar.UI.lockTime();
@@ -25,6 +33,19 @@ Calendar={
minWidth:'auto',
classes: 'category',
});
+ Calendar.UI.repeat('init');
+ $('#end').change(function(){
+ Calendar.UI.repeat('end');
+ });
+ $('#repeat').change(function(){
+ Calendar.UI.repeat('repeat');
+ });
+ $('#advanced_year').change(function(){
+ Calendar.UI.repeat('year');
+ });
+ $('#advanced_month').change(function(){
+ Calendar.UI.repeat('month');
+ });
$('#event').dialog({
width : 500,
close : function(event, ui) {
@@ -41,6 +62,7 @@ Calendar={
// TODO: save event
$('#event').dialog('destroy').remove();
}else{
+ Calendar.UI.loading(true);
$('#dialog_holder').load(OC.filePath('calendar', 'ajax', 'neweventform.php'), {start:start, end:end, allday:allday?1:0}, Calendar.UI.startEventDialog);
}
},
@@ -50,13 +72,16 @@ Calendar={
// TODO: save event
$('#event').dialog('destroy').remove();
}else{
+ Calendar.UI.loading(true);
$('#dialog_holder').load(OC.filePath('calendar', 'ajax', 'editeventform.php') + '?id=' + id, Calendar.UI.startEventDialog);
}
},
submitDeleteEventForm:function(url){
var post = $( '#event_form' ).serialize();
$('#errorbox').empty();
+ Calendar.UI.loading(true);
$.post(url, post, function(data){
+ Calendar.UI.loading(false);
if(data.status == 'success'){
$('#calendar_holder').fullCalendar('removeEvents', $('#event_form input[name=id]').val());
$('#event').dialog('destroy').remove();
@@ -69,8 +94,10 @@ Calendar={
validateEventForm:function(url){
var post = $( "#event_form" ).serialize();
$("#errorbox").empty();
+ Calendar.UI.loading(true);
$.post(url, post,
function(data){
+ Calendar.UI.loading(false);
if(data.status == "error"){
var output = missing_field + ": <br />";
if(data.title == "true"){
@@ -107,8 +134,10 @@ Calendar={
},
moveEvent:function(event, dayDelta, minuteDelta, allDay, revertFunc){
$('.tipsy').remove();
+ Calendar.UI.loading(true);
$.post(OC.filePath('calendar', 'ajax', 'moveevent.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, allDay: allDay?1:0, lastmodified: event.lastmodified},
function(data) {
+ Calendar.UI.loading(false);
if (data.status == 'success'){
event.lastmodified = data.lastmodified;
console.log("Event moved successfully");
@@ -120,8 +149,10 @@ Calendar={
},
resizeEvent:function(event, dayDelta, minuteDelta, revertFunc){
$('.tipsy').remove();
+ Calendar.UI.loading(true);
$.post(OC.filePath('calendar', 'ajax', 'resizeevent.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, lastmodified: event.lastmodified},
function(data) {
+ Calendar.UI.loading(false);
if (data.status == 'success'){
event.lastmodified = data.lastmodified;
console.log("Event resized successfully");
@@ -132,9 +163,16 @@ Calendar={
});
},
showadvancedoptions:function(){
- $("#advanced_options").css("display", "block");
+ $("#advanced_options").slideDown('slow');
$("#advanced_options_button").css("display", "none");
},
+ showadvancedoptionsforrepeating:function(){
+ if($("#advanced_options_repeating").is(":hidden")){
+ $('#advanced_options_repeating').slideDown('slow');
+ }else{
+ $('#advanced_options_repeating').slideUp('slow');
+ }
+ },
getEventPopupText:function(event){
if (event.allDay){
var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}")
@@ -205,11 +243,114 @@ Calendar={
event.preventDefault();
}
},
+ repeat:function(task){
+ if(task=='init'){
+ $('#byweekno').multiselect({
+ header: false,
+ noneSelectedText: $('#advanced_byweekno').attr('title'),
+ selectedList: 2,
+ minWidth:'auto'
+ });
+ $('#weeklyoptions').multiselect({
+ header: false,
+ noneSelectedText: $('#weeklyoptions').attr('title'),
+ selectedList: 2,
+ minWidth:'auto'
+ });
+ $('input[name="bydate"]').datepicker({
+ dateFormat : 'dd-mm-yy'
+ });
+ $('#byyearday').multiselect({
+ header: false,
+ noneSelectedText: $('#byyearday').attr('title'),
+ selectedList: 2,
+ minWidth:'auto'
+ });
+ $('#bymonth').multiselect({
+ header: false,
+ noneSelectedText: $('#bymonth').attr('title'),
+ selectedList: 2,
+ minWidth:'auto'
+ });
+ $('#bymonthday').multiselect({
+ header: false,
+ noneSelectedText: $('#bymonthday').attr('title'),
+ selectedList: 2,
+ minWidth:'auto'
+ });
+ Calendar.UI.repeat('end');
+ Calendar.UI.repeat('month');
+ Calendar.UI.repeat('year');
+ Calendar.UI.repeat('repeat');
+ }
+ if(task == 'end'){
+ $('#byoccurrences').css('display', 'none');
+ $('#bydate').css('display', 'none');
+ if($('#end option:selected').val() == 'count'){
+ $('#byoccurrences').css('display', 'block');
+ }
+ if($('#end option:selected').val() == 'date'){
+ $('#bydate').css('display', 'block');
+ }
+ }
+ if(task == 'repeat'){
+ $('#advanced_month').css('display', 'none');
+ $('#advanced_weekday').css('display', 'none');
+ $('#advanced_weekofmonth').css('display', 'none');
+ $('#advanced_byyearday').css('display', 'none');
+ $('#advanced_bymonth').css('display', 'none');
+ $('#advanced_byweekno').css('display', 'none');
+ $('#advanced_year').css('display', 'none');
+ $('#advanced_bymonthday').css('display', 'none');
+ if($('#repeat option:selected').val() == 'monthly'){
+ $('#advanced_month').css('display', 'block');
+ Calendar.UI.repeat('month');
+ }
+ if($('#repeat option:selected').val() == 'weekly'){
+ $('#advanced_weekday').css('display', 'block');
+ }
+ if($('#repeat option:selected').val() == 'yearly'){
+ $('#advanced_year').css('display', 'block');
+ Calendar.UI.repeat('year');
+ }
+ if($('#repeat option:selected').val() == 'doesnotrepeat'){
+ $('#advanced_options_repeating').slideUp('slow');
+ }
+ }
+ if(task == 'month'){
+ $('#advanced_weekday').css('display', 'none');
+ $('#advanced_weekofmonth').css('display', 'none');
+ if($('#advanced_month_select option:selected').val() == 'weekday'){
+ $('#advanced_weekday').css('display', 'block');
+ $('#advanced_weekofmonth').css('display', 'block');
+ }
+ }
+ if(task == 'year'){
+ $('#advanced_weekday').css('display', 'none');
+ $('#advanced_byyearday').css('display', 'none');
+ $('#advanced_bymonth').css('display', 'none');
+ $('#advanced_byweekno').css('display', 'none');
+ $('#advanced_bymonthday').css('display', 'none');
+ if($('#advanced_year_select option:selected').val() == 'byyearday'){
+ //$('#advanced_byyearday').css('display', 'block');
+ }
+ if($('#advanced_year_select option:selected').val() == 'byweekno'){
+ $('#advanced_byweekno').css('display', 'block');
+ }
+ if($('#advanced_year_select option:selected').val() == 'bydaymonth'){
+ $('#advanced_bymonth').css('display', 'block');
+ $('#advanced_bymonthday').css('display', 'block');
+ $('#advanced_weekday').css('display', 'block');
+ }
+ }
+
+ },
Calendar:{
overview:function(){
if($('#choosecalendar_dialog').dialog('isOpen') == true){
$('#choosecalendar_dialog').dialog('moveToTop');
}else{
+ Calendar.UI.loading(true);
$('#dialog_holder').load(OC.filePath('calendar', 'ajax', 'choosecalendar.php'), function(){
$('#choosecalendar_dialog').dialog({
width : 600,
@@ -217,13 +358,16 @@ Calendar={
$(this).dialog('destroy').remove();
}
});
+ Calendar.UI.loading(false);
});
}
},
activation:function(checkbox, calendarid)
{
+ Calendar.UI.loading(true);
$.post(OC.filePath('calendar', 'ajax', 'activation.php'), { calendarid: calendarid, active: checkbox.checked?1:0 },
function(data) {
+ Calendar.UI.loading(false);
if (data.status == 'success'){
checkbox.checked = data.active == 1;
if (data.active == 1){
@@ -520,6 +664,7 @@ $(document).ready(function(){
}
});
},
+ loading: Calendar.UI.loading,
eventSources: eventSources
});
$('#oneweekview_radio').click(function(){
diff --git a/apps/calendar/js/geo.js b/apps/calendar/js/geo.js
index acea17c0269..ae6a971e938 100755
--- a/apps/calendar/js/geo.js
+++ b/apps/calendar/js/geo.js
@@ -8,8 +8,9 @@ if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
$.getJSON(OC.filePath('calendar', 'ajax', 'guesstimezone.php?lat=' + position.coords.latitude + '&long=' + position.coords.longitude + ''),
function(data){
- if (data.status == 'success'){
+ if (data.status == 'success' && typeof(data.message) != 'undefined'){
$('#notification').html(data.message);
+ $('#notification').attr('title', 'CC BY 3.0 by Geonames.org');
$('#notification').slideDown();
window.setTimeout(function(){$('#notification').slideUp();}, 5000);
}else{
diff --git a/apps/calendar/js/settings.js b/apps/calendar/js/settings.js
index 6c00be06b39..73300885565 100644
--- a/apps/calendar/js/settings.js
+++ b/apps/calendar/js/settings.js
@@ -1,63 +1,35 @@
$(document).ready(function(){
- $("#timezone").change( function(){
+ $('#timezone').change( function(){
OC.msg.startSaving('#calendar .msg')
// Serialize the data
- var post = $( "#timezone" ).serialize();
+ var post = $( '#timezone' ).serialize();
$.post( OC.filePath('calendar', 'ajax', 'settimezone.php'), post, function(data){
//OC.msg.finishedSaving('#calendar .msg', data);
});
return false;
});
- $("#timezone").chosen();
- $("#firstdayofweek").change( function(){
- var data = $("#firstdayofweek").serialize();
- $.post( OC.filePath('calendar', 'ajax', 'setfirstdayofweek.php'), data, function(data){
- if(data == "error"){
- console.log("saving first day of week failed");
- }
- });
- });
- $.getJSON(OC.filePath('calendar', 'ajax', 'firstdayofweek.php'), function(jsondata, status) {
- $("#select_" + jsondata.firstdayofweek).attr('selected',true);
- $("#firstdayofweek").chosen();
- });
- $.getJSON(OC.filePath('calendar', 'ajax', 'daysofweekend.php'), function(jsondata, status) {
- for(day in jsondata){
- if(jsondata[day] == "true"){
- $("#selectweekend_" + day).attr('selected',true);
- }
- }
- $("#weekend").chosen();
- });
- $("#timeformat").change( function(){
- var data = $("#timeformat").serialize();
+ $('#timezone').chosen();
+ $('#timeformat').change( function(){
+ var data = $('#timeformat').serialize();
$.post( OC.filePath('calendar', 'ajax', 'settimeformat.php'), data, function(data){
- if(data == "error"){
- console.log("saving timeformat failed");
+ if(data == 'error'){
+ console.log('saving timeformat failed');
}
});
});
- $.getJSON(OC.filePath('calendar', 'ajax', 'timeformat.php'), function(jsondata, status) {
- $("#" + jsondata.timeformat).attr('selected',true);
- $("#timeformat").chosen();
- });
- $("#duration").blur( function(){
- var data = $("#duration").val();
- $.post( OC.filePath('calendar', 'ajax', 'setduration.php'), {duration: data}, function(data){
- if(data == "error"){
- console.log("saving duration failed");
- }
+ $('#timezonedetection').change( function(){
+ var post = $('#timezonedetection').serialize();
+ $.post( OC.filePath('calendar', 'ajax', 'timezonedetection.php'), post, function(data){
+
});
});
- $.getJSON(OC.filePath('calendar', 'ajax', 'duration.php'), function(jsondata, status) {
- $("#duration").val(jsondata.duration);
+ $.getJSON(OC.filePath('calendar', 'ajax', 'timeformat.php'), function(jsondata, status) {
+ $('#' + jsondata.timeformat).attr('selected',true);
+ $('#timeformat').chosen();
});
- $("#weekend").change( function(){
- var data = $("#weekend").serialize();
- $.post( OC.filePath('calendar', 'ajax', 'setdaysofweekend.php'), data, function(data){
- if(data == "error"){
- console.log("saving days of weekend failed");
- }
- });
+ $.getJSON(OC.filePath('calendar', 'ajax', 'gettimezonedetection.php'), function(jsondata, status){
+ if(jsondata.detection == 'true'){
+ $('#timezonedetection').attr('checked', 'checked');
+ }
});
});
diff --git a/apps/calendar/lib/app.php b/apps/calendar/lib/app.php
new file mode 100644
index 00000000000..6e92cf67c5c
--- /dev/null
+++ b/apps/calendar/lib/app.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * This class manages our app actions
+ */
+OC_Calendar_App::$l10n = new OC_L10N('calendar');
+class OC_Calendar_App{
+ public static $l10n;
+
+ public static function getCalendar($id){
+ $calendar = OC_Calendar_Calendar::find( $id );
+ if( $calendar === false || $calendar['userid'] != OC_User::getUser()){
+ OC_JSON::error(array('data' => array('message' => self::$l10n->t('Wrong calendar'))));
+ exit();
+ }
+ return $calendar;
+ }
+
+ public static function getEventObject($id){
+ $event_object = OC_Calendar_Object::find( $id );
+ if( $event_object === false ){
+ OC_JSON::error();
+ exit();
+ }
+
+ self::getCalendar( $event_object['calendarid'] );//access check
+ return $event_object;
+ }
+
+ public static function getVCalendar($id){
+ $event_object = self::getEventObject( $id );
+
+ $vcalendar = OC_VObject::parse($event_object['calendardata']);
+ // Check if the vcalendar is valid
+ if(is_null($vcalendar)){
+ OC_JSON::error();
+ exit();
+ }
+ return $vcalendar;
+ }
+
+ public static function isNotModified($vevent, $lastmodified)
+ {
+ $last_modified = $vevent->__get('LAST-MODIFIED');
+ if($last_modified && $lastmodified != $last_modified->getDateTime()->format('U')){
+ OC_JSON::error(array('modified'=>true));
+ exit;
+ }
+ }
+
+ public static function getCategoryOptions()
+ {
+ return array(
+ self::$l10n->t('Birthday'),
+ self::$l10n->t('Business'),
+ self::$l10n->t('Call'),
+ self::$l10n->t('Clients'),
+ self::$l10n->t('Deliverer'),
+ self::$l10n->t('Holidays'),
+ self::$l10n->t('Ideas'),
+ self::$l10n->t('Journey'),
+ self::$l10n->t('Jubilee'),
+ self::$l10n->t('Meeting'),
+ self::$l10n->t('Other'),
+ self::$l10n->t('Personal'),
+ self::$l10n->t('Projects'),
+ self::$l10n->t('Questions'),
+ self::$l10n->t('Work'),
+ );
+ }
+
+ public static function getRepeatOptions(){
+ return OC_Calendar_Object::getRepeatOptions(self::$l10n);
+ }
+
+ public static function getEndOptions(){
+ return OC_Calendar_Object::getEndOptions(self::$l10n);
+ }
+
+ public static function getMonthOptions(){
+ return OC_Calendar_Object::getMonthOptions(self::$l10n);
+ }
+
+ public static function getWeeklyOptions(){
+ return OC_Calendar_Object::getWeeklyOptions(self::$l10n);
+ }
+
+ public static function getYearOptions(){
+ return OC_Calendar_Object::getYearOptions(self::$l10n);
+ }
+
+ public static function getByYearDayOptions(){
+ return OC_Calendar_Object::getByYearDayOptions();
+ }
+
+ public static function getByMonthOptions(){
+ return OC_Calendar_Object::getByMonthOptions(self::$l10n);
+ }
+
+ public static function getByWeekNoOptions(){
+ return OC_Calendar_Object::getByWeekNoOptions();
+ }
+
+ public static function getByMonthDayOptions(){
+ return OC_Calendar_Object::getByMonthDayOptions();
+ }
+
+ public static function getWeekofMonth(){
+ return OC_Calendar_Object::getWeekofMonth(self::$l10n);
+ }
+}
diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php
index 3db4398096e..ea60526a5bd 100644
--- a/apps/calendar/lib/calendar.php
+++ b/apps/calendar/lib/calendar.php
@@ -82,7 +82,7 @@ class OC_Calendar_Calendar{
* @param integer $id
* @return associative array
*/
- public static function findCalendar($id){
+ public static function find($id){
$stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE id = ?' );
$result = $stmt->execute(array($id));
@@ -148,7 +148,7 @@ class OC_Calendar_Calendar{
*/
public static function editCalendar($id,$name=null,$components=null,$timezone=null,$order=null,$color=null){
// Need these ones for checking uri
- $calendar = self::findCalendar($id);
+ $calendar = self::find($id);
// Keep old stuff
if(is_null($name)) $name = $calendar['name'];
diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php
index 1c145003511..cbb1badf802 100644
--- a/apps/calendar/lib/object.php
+++ b/apps/calendar/lib/object.php
@@ -356,9 +356,99 @@ class OC_Calendar_Object{
'weekday' => $l10n->t('Every Weekday'),
'biweekly' => $l10n->t('Bi-Weekly'),
'monthly' => $l10n->t('Monthly'),
- 'yearly' => $l10n->t('Yearly'),
+ 'yearly' => $l10n->t('Yearly')
);
}
+
+ public static function getEndOptions($l10n)
+ {
+ return array(
+ 'never' => $l10n->t('never'),
+ 'count' => $l10n->t('by occurrences'),
+ 'date' => $l10n->t('by date')
+ );
+ }
+
+ public static function getMonthOptions($l10n)
+ {
+ return array(
+ 'monthday' => $l10n->t('by monthday'),
+ 'weekday' => $l10n->t('by weekday')
+ );
+ }
+
+ public static function getWeeklyOptions($l10n)
+ {
+ return array(
+ 'MO' => $l10n->t('Monday'),
+ 'TU' => $l10n->t('Tuesday'),
+ 'WE' => $l10n->t('Wednesday'),
+ 'TH' => $l10n->t('Thursday'),
+ 'FR' => $l10n->t('Friday'),
+ 'SA' => $l10n->t('Saturday'),
+ 'SU' => $l10n->t('Sunday')
+ );
+ }
+
+ public static function getWeekofMonth($l10n)
+ {
+ return array(
+ 'auto' => $l10n->t('events week of month'),
+ '1' => $l10n->t('first'),
+ '2' => $l10n->t('second'),
+ '3' => $l10n->t('third'),
+ '4' => $l10n->t('fourth'),
+ '5' => $l10n->t('fifth'),
+ '-1' => $l10n->t('last')
+ );
+ }
+
+ public static function getByYearDayOptions(){
+ $return = array();
+ foreach(range(1,366) as $num){
+ $return[(string) $num] = (string) $num;
+ }
+ return $return;
+ }
+
+ public static function getByMonthDayOptions(){
+ $return = array();
+ foreach(range(1,31) as $num){
+ $return[(string) $num] = (string) $num;
+ }
+ return $return;
+ }
+
+ public static function getByMonthOptions($l10n){
+ return array(
+ '1' => $l10n->t('January'),
+ '2' => $l10n->t('February'),
+ '3' => $l10n->t('March'),
+ '4' => $l10n->t('April'),
+ '5' => $l10n->t('May'),
+ '6' => $l10n->t('June'),
+ '7' => $l10n->t('July'),
+ '8' => $l10n->t('August'),
+ '9' => $l10n->t('September'),
+ '10' => $l10n->t('October'),
+ '11' => $l10n->t('November'),
+ '12' => $l10n->t('December')
+ );
+ }
+
+ public static function getYearOptions($l10n){
+ return array(
+ 'bydate' => $l10n->t('by events date'),
+ 'byyearday' => $l10n->t('by yearday(s)'),
+ 'byweekno' => $l10n->t('by weeknumber(s)'),
+ 'bydaymonth' => $l10n->t('by day and month')
+ );
+ }
+
+ public static function getByWeekNoOptions(){
+ return range(1, 52);
+ }
+
public static function validateRequest($request)
{
$errnum = 0;
@@ -367,7 +457,7 @@ class OC_Calendar_Object{
$errarr['title'] = 'true';
$errnum++;
}
- $calendar = OC_Calendar_Calendar::findCalendar($request['calendar']);
+ $calendar = OC_Calendar_Calendar::find($request['calendar']);
if($calendar['userid'] != OC_User::getUser()){
$errarr['cal'] = 'true';
$errnum++;
@@ -397,7 +487,91 @@ class OC_Calendar_Object{
$errarr['to'] = 'true';
$errnum++;
}
- ;
+ if($request['repeat'] != 'doesnotrepeat'){
+ if(is_nan($request['interval']) && $request['interval'] != ''){
+ $errarr['interval'] = 'true';
+ $ernum++;
+ }
+ if(array_key_exists('repeat', $request) && !array_key_exists($request['repeat'], self::getRepeatOptions(OC_Calendar_App::$l10n))){
+ $errarr['repeat'] = 'true';
+ $ernum++;
+ }
+ if(array_key_exists('advanced_month_select', $request) && !array_key_exists($request['advanced_month_select'], self::getMonthOptions(OC_Calendar_App::$l10n))){
+ $errarr['advanced_month_select'] = 'true';
+ $errnum++;
+ }
+ if(array_key_exists('advanced_year_select', $request) && !array_key_exists($request['advanced_year_select'], self::getYearOptions(OC_Calendar_App::$l10n))){
+ $errarr['advanced_year_select'] = 'true';
+ $errnum++;
+ }
+ if(array_key_exists('weekofmonthoptions', $request) && !array_key_exists($request['weekofmonthoptions'], self::getWeekofMonth(OC_Calendar_App::$l10n))){
+ $errarr['weekofmonthoptions'] = 'true';
+ $errnum++;
+ }
+ if($request['end'] != 'never'){
+ if(!array_key_exists($request['end'], self::getEndOptions(OC_Calendar_App::$l10n))){
+ $errarr['end'] = 'true';
+ $errnum++;
+ }
+ if($request['end'] == 'count' && is_nan($request['byoccurrences'])){
+ $errarr['byoccurrences'] = 'true';
+ $errnum++;
+ }
+ if($request['end'] == 'date'){
+ list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']);
+ if(!checkdate($bydate_month, $bydate_day, $bydate_year)){
+ $errarr['bydate'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ if(array_key_exists('weeklyoptions', $request)){
+ foreach($request['weeklyoptions'] as $option){
+ if(!in_array($option, self::getWeeklyOptions(OC_Calendar_App::$l10n))){
+ $errarr['weeklyoptions'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ if(array_key_exists('byyearday', $request)){
+ foreach($request['byyearday'] as $option){
+ if(!array_key_exists($option, self::getByYearDayOptions())){
+ $errarr['byyearday'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ if(array_key_exists('weekofmonthoptions', $request)){
+ if(is_nan((double)$request['weekofmonthoptions'])){
+ $errarr['weekofmonthoptions'] = 'true';
+ $errnum++;
+ }
+ }
+ if(array_key_exists('bymonth', $request)){
+ foreach($request['bymonth'] as $option){
+ if(!in_array($option, self::getByMonthOptions(OC_Calendar_App::$l10n))){
+ $errarr['bymonth'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ if(array_key_exists('byweekno', $request)){
+ foreach($request['byweekno'] as $option){
+ if(!array_key_exists($option, self::getByWeekNoOptions())){
+ $errarr['byweekno'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ if(array_key_exists('bymonthday', $request)){
+ foreach($request['bymonthday'] as $option){
+ if(!array_key_exists($option, self::getByMonthDayOptions())){
+ $errarr['bymonthday'] = 'true';
+ $errnum++;
+ }
+ }
+ }
+ }
if(!$allday && self::checkTime(urldecode($request['totime']))) {
$errarr['totime'] = 'true';
$errnum++;
@@ -468,27 +642,148 @@ class OC_Calendar_Object{
$fromtime = $request['fromtime'];
$totime = $request['totime'];
}
+ $vevent = $vcalendar->VEVENT;
$description = $request["description"];
- //$repeat = $request["repeat"];
- /*switch($request["repeatfreq"]){
- case "DAILY":
- $repeatfreq = "DAILY";
- case "WEEKLY":
- $repeatfreq = "WEEKLY";
- case "WEEKDAY":
- $repeatfreq = "DAILY;BYDAY=MO,TU,WE,TH,FR"; //load weeksdayss from userconfig when weekdays are choosable
- case "":
- $repeatfreq = "";
- case "":
- $repeatfreq = "";
- case "":
- $repeatfreq = "";
- default:
- $repeat = "false";
- }*/
- $repeat = "false";
+ $repeat = $request["repeat"];
+ if($repeat != 'doesnotrepeat'){
+ $rrule = '';
+ $interval = $request['interval'];
+ $end = $request['end'];
+ $byoccurrences = $request['byoccurrences'];
+ switch($repeat){
+ case 'daily':
+ $rrule .= 'FREQ=DAILY';
+ break;
+ case 'weekly':
+ $rrule .= 'FREQ=WEEKLY';
+ if(array_key_exists('weeklyoptions', $request)){
+ $byday = '';
+ $daystrings = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n));
+ foreach($request['weeklyoptions'] as $days){
+ if($byday == ''){
+ $byday .= $daystrings[$days];
+ }else{
+ $byday .= ',' .$daystrings[$days];
+ }
+ }
+ $rrule .= ';BYDAY=' . $byday;
+ }
+ break;
+ case 'weekday':
+ $rrule .= 'FREQ=WEEKLY';
+ $rrule .= ';BYDAY=MO,TU,WE,TH,FR';
+ break;
+ case 'biweekly':
+ $rrule .= 'FREQ=WEEKLY';
+ $interval = $interval * 2;
+ break;
+ case 'monthly':
+ $rrule .= 'FREQ=MONTHLY';
+ if($request['advanced_month_select'] == 'monthday'){
+ break;
+ }elseif($request['advanced_month_select'] == 'weekday'){
+ if($request['weekofmonthoptions'] == 'auto'){
+ list($_day, $_month, $_year) = explode('-', $from);
+ $weekofmonth = floor($_day/7);
+ }else{
+ $weekofmonth = $request['weekofmonthoptions'];
+ }
+ $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n));
+ $byday = '';
+ foreach($request['weeklyoptions'] as $day){
+ if($byday == ''){
+ $byday .= $weekofmonth . $days[$day];
+ }else{
+ $byday .= ',' . $weekofmonth . $days[$day];
+ }
+ }
+ $rrule .= ';BYDAY=' . $byday;
+ }
+ break;
+ case 'yearly':
+ $rrule .= 'FREQ=YEARLY';
+ if($request['advanced_year_select'] == 'bydate'){
+
+ }elseif($request['advanced_year_select'] == 'byyearday'){
+ list($_day, $_month, $_year) = explode('-', $from);
+ $byyearday = date('z', mktime(0,0,0, $_month, $_day, $_year)) + 1;
+ if(array_key_exists('byyearday', $request)){
+ foreach($request['byyearday'] as $yearday){
+ $byyearday .= ',' . $yearday;
+ }
+ }
+ $rrule .= ';BYYEARDAY=' . $byyearday;
+ }elseif($request['advanced_year_select'] == 'byweekno'){
+ list($_day, $_month, $_year) = explode('-', $from);
+ $rrule .= ';BYDAY=' . strtoupper(substr(date('l', mktime(0,0,0, $_month, $_day, $_year)), 0, 2));
+ $byweekno = '';
+ foreach($request['byweekno'] as $weekno){
+ if($byweekno == ''){
+ $byweekno = $weekno;
+ }else{
+ $byweekno .= ',' . $weekno;
+ }
+ }
+ $rrule .= ';BYWEEKNO=' . $byweekno;
+ }elseif($request['advanced_year_select'] == 'bydaymonth'){
+ if(array_key_exists('weeklyoptions', $request)){
+ $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n));
+ $byday = '';
+ foreach($request['weeklyoptions'] as $day){
+ if($byday == ''){
+ $byday .= $days[$day];
+ }else{
+ $byday .= ',' . $days[$day];
+ }
+ }
+ $rrule .= ';BYDAY=' . $byday;
+ }
+ if(array_key_exists('bymonth', $request)){
+ $monthes = array_flip(self::getByMonthOptions(OC_Calendar_App::$l10n));
+ $bymonth = '';
+ foreach($request['bymonth'] as $month){
+ if($bymonth == ''){
+ $bymonth .= $monthes[$month];
+ }else{
+ $bymonth .= ',' . $monthes[$month];
+ }
+ }
+ $rrule .= ';BYMONTH=' . $bymonth;
+
+ }
+ if(array_key_exists('bymonthday', $request)){
+ $bymonthday = '';
+ foreach($request['bymonthday'] as $monthday){
+ if($bymonthday == ''){
+ $bymonthday .= $monthday;
+ }else{
+ $bymonthday .= ',' . $monthday;
+ }
+ }
+ $rrule .= ';BYMONTHDAY=' . $bymonthday;
+
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ if($interval != ''){
+ $rrule .= ';INTERVAL=' . $interval;
+ }
+ if($end == 'count'){
+ $rrule .= ';COUNT=' . $byoccurrences;
+ }
+ if($end == 'date'){
+ list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']);
+ $rrule .= ';UNTIL=' . $bydate_year . $bydate_month . $bydate_day;
+ }
+ $vevent->setString('RRULE', $rrule);
+ $repeat = "true";
+ }else{
+ $repeat = "false";
+ }
- $vevent = $vcalendar->VEVENT;
$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Element_DateTime::UTC);
$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Element_DateTime::UTC);
@@ -521,4 +816,4 @@ class OC_Calendar_Object{
return $vcalendar;
}
-}
+} \ No newline at end of file
diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php
index 41faf49a519..425c93c7338 100644
--- a/apps/calendar/lib/search.php
+++ b/apps/calendar/lib/search.php
@@ -12,15 +12,36 @@ class OC_Search_Provider_Calendar extends OC_Search_Provider{
}else{
$searchquery[] = $query;
}
+ $user_timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', date_default_timezone_get());
+ $l = new OC_l10n('calendar');
foreach($calendars as $calendar){
$objects = OC_Calendar_Object::all($calendar['id']);
foreach($objects as $object){
- if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){//$name,$text,$link,$type
- $results[]=new OC_Search_Result($object['summary'],'','#','Cal.');
+ if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){
+ $calendardata = OC_VObject::parse($object['calendardata']);
+ $vevent = $calendardata->VEVENT;
+ $dtstart = $vevent->DTSTART;
+ $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
+ $start_dt = $dtstart->getDateTime();
+ $start_dt->setTimezone(new DateTimeZone($user_timezone));
+ $end_dt = $dtend->getDateTime();
+ $end_dt->setTimezone(new DateTimeZone($user_timezone));
+ if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){
+ $end_dt->modify('-1 sec');
+ if($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')){
+ $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y');
+ }else{
+ $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y');
+ }
+ }else{
+ $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i');
+ }
+ $link = OC_Helper::linkTo('apps/calendar', 'index.php?showevent='.urlencode($object['id']));
+ $results[]=new OC_Search_Result($object['summary'],$info, $link,$l->t('Cal.'));//$name,$text,$link,$type
}
}
}
return $results;
}
}
-new OC_Search_Provider_Calendar(); \ No newline at end of file
+new OC_Search_Provider_Calendar();
diff --git a/apps/calendar/resettimezone.php b/apps/calendar/resettimezone.php
new file mode 100644
index 00000000000..1ef9591ae39
--- /dev/null
+++ b/apps/calendar/resettimezone.php
@@ -0,0 +1,4 @@
+<?php
+require_once ("../../lib/base.php");
+OC_Preferences::deleteKey(OC_USER::getUser(), 'calendar', 'timezone');
+?> \ No newline at end of file
diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php
index 2003b7efc49..92c1b8a778a 100755
--- a/apps/calendar/templates/calendar.php
+++ b/apps/calendar/templates/calendar.php
@@ -18,7 +18,18 @@
var missing_field_startsbeforeends = '<?php echo $l->t('The event ends before it starts') ?>';
var missing_field_dberror = '<?php echo $l->t('There was a database fail') ?>';
var totalurl = '<?php echo OC_Helper::linkTo('apps/calendar', 'caldav.php', null, true); ?>/calendars';
+ $(document).ready(function() {
+ <?php
+ if(array_key_exists('showevent', $_)){
+ $data = OC_Calendar_App::getEventObject($_['showevent']);
+ $date = substr($data['startdate'], 0, 10);
+ list($year, $month, $day) = explode('-', $date);
+ echo '$(\'#calendar_holder\').fullCalendar(\'gotoDate\', ' . $year . ', ' . --$month . ', ' . $day . ');';
+ }
+ ?>
+ });
</script>
+ <div id="loading"><img src="<?php echo OC_Helper::imagePath('core', 'loading.gif'); ?>" /></div>
<div id="controls">
<div>
<form>
diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php
index dfa5fb8c78a..1f2073f4bc7 100644
--- a/apps/calendar/templates/part.eventform.php
+++ b/apps/calendar/templates/part.eventform.php
@@ -2,92 +2,221 @@
<tr>
<th width="75px"><?php echo $l->t("Title");?>:</th>
<td>
- <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Title of the Event");?>" value="<?php echo isset($_['title']) ? $_['title'] : '' ?>" maxlength="100" name="title"/>
+ <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Title of the Event");?>" value="<?php echo isset($_['title']) ? $_['title'] : '' ?>" maxlength="100" name="title"/>
</td>
</tr>
</table>
- <table>
+ <table width="100%">
<tr>
<th width="75px"><?php echo $l->t("Category");?>:</th>
<td>
- <select id="category" name="categories[]" multiple="multiple" title="<?php echo $l->t("Select category") ?>">
- <?php
- if (!isset($_['categories'])) {$_['categories'] = array();}
- echo html_select_options($_['category_options'], $_['categories'], array('combine'=>true));
- ?>
- </select></td>
+ <select id="category" name="categories[]" multiple="multiple" title="<?php echo $l->t("Select category") ?>">
+ <?php
+ if (!isset($_['categories'])) {$_['categories'] = array();}
+ echo html_select_options($_['category_options'], $_['categories'], array('combine'=>true));
+ ?>
+ </select>
+ </td>
<th width="75px">&nbsp;&nbsp;&nbsp;<?php echo $l->t("Calendar");?>:</th>
<td>
- <select style="width:140px;" name="calendar">
- <?php
- if (!isset($_['calendar'])) {$_['calendar'] = false;}
- echo html_select_options($_['calendar_options'], $_['calendar'], array('value'=>'id', 'label'=>'displayname'));
- ?>
- </select></td>
+ <select style="width:140px;" name="calendar">
+ <?php
+ if (!isset($_['calendar'])) {$_['calendar'] = false;}
+ echo html_select_options($_['calendar_options'], $_['calendar'], array('value'=>'id', 'label'=>'displayname'));
+ ?>
+ </select>
+ </td>
</tr>
</table>
<hr>
- <table>
+ <table width="100%">
<tr>
<th width="75px"></th>
<td>
- <input onclick="Calendar.UI.lockTime();" type="checkbox"<?php if($_['allday']){echo 'checked="checked"';} ?> id="allday_checkbox" name="allday">
- <label for="allday_checkbox"><?php echo $l->t("All Day Event");?></label></td>
+ <input onclick="Calendar.UI.lockTime();" type="checkbox"<?php if($_['allday']){echo 'checked="checked"';} ?> id="allday_checkbox" name="allday">
+ <label for="allday_checkbox"><?php echo $l->t("All Day Event");?></label>
+ </td>
</tr>
<tr>
-
<th width="75px"><?php echo $l->t("From");?>:</th>
<td>
- <input type="text" value="<?php echo $_['startdate'];?>" name="from" id="from">
- &nbsp;&nbsp;
- <input type="time" value="<?php echo $_['starttime'];?>" name="fromtime" id="fromtime">
- </td><!--use jquery-->
+ <input type="text" value="<?php echo $_['startdate'];?>" name="from" id="from">
+ &nbsp;&nbsp;
+ <input type="time" value="<?php echo $_['starttime'];?>" name="fromtime" id="fromtime">
+ </td>
</tr>
<tr>
<th width="75px"><?php echo $l->t("To");?>:</th>
<td>
- <input type="text" value="<?php echo $_['enddate'];?>" name="to" id="to">
- &nbsp;&nbsp;
- <input type="time" value="<?php echo $_['endtime'];?>" name="totime" id="totime">
- </td><!--use jquery-->
+ <input type="text" value="<?php echo $_['enddate'];?>" name="to" id="to">
+ &nbsp;&nbsp;
+ <input type="time" value="<?php echo $_['endtime'];?>" name="totime" id="totime">
+ </td>
</tr>
</table>
<input type="button" class="submit" value="<?php echo $l->t("Advanced options"); ?>" onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button">
<div id="advanced_options" style="display: none;">
- <!--
- <table>
- <tr>
- <th width="75px"><?php echo $l->t("Repeat");?>:</th>
- <td>
- <select name="repeat" style="width:350px;">
- <?php
- if (isset($_['repeat_options'])) {
+ <table style="width:100%">
+ <tr>
+ <th width="75px"><?php echo $l->t("Repeat");?>:</th>
+ <td>
+ <select id="repeat" name="repeat">
+ <?php
echo html_select_options($_['repeat_options'], $_['repeat']);
- }
- ?>
- </select></td>
- </tr>-->
- </table>
- <hr>
- <table><!--
- <tr>
- <th width="75px"><?php echo $l->t("Attendees");?>:</th>
- <td style="height: 50px;"></td>
- </tr>
- </table>
- <hr>-->
- <table>
- <tr>
- <th width="85px"><?php echo $l->t("Location");?>:</th>
- <td>
- <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Location of the Event");?>" value="<?php echo isset($_['location']) ? $_['location'] : '' ?>" maxlength="100" name="location" />
- </td>
- </tr>
- </table>
- <table>
- <tr>
- <th width="85px" style="vertical-align: top;"><?php echo $l->t("Description");?>:</th>
- <td><textarea style="width:350px;height: 150px;" placeholder="<?php echo $l->t("Description of the Event");?>" name="description"><?php echo isset($_['description']) ? $_['description'] : '' ?></textarea></td>
- </tr>
- </table>
+ ?>
+ </select></td>
+ <td><input type="button" style="float:right;" class="submit" value="<?php echo $l->t("Advanced"); ?>" onclick="Calendar.UI.showadvancedoptionsforrepeating();" id="advanced_options_button"></td>
+ </tr>
+ </table>
+ <div id="advanced_options_repeating" style="display:none;">
+ <table style="width:100%">
+ <tr id="advanced_month" style="display:none;">
+ <th width="75px"></th>
+ <td>
+ <select id="advanced_month_select" name="advanced_month_select">
+ <?php
+ echo html_select_options($_['repeat_month_options'], $_['repeat_month']);
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_year" style="display:none;">
+ <th width="75px"></th>
+ <td>
+ <select id="advanced_year_select" name="advanced_year_select">
+ <?php
+ echo html_select_options($_['repeat_year_options'], $_['repeat_year']);
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_weekofmonth" style="display:none;">
+ <th width="75px"></th>
+ <td id="weekofmonthcheckbox">
+ <select id="weekofmonthoptions" name="weekofmonthoptions">
+ <?php
+ echo html_select_options($_['repeat_weekofmonth_options'], $_['repeat_weekofmonth']);
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_weekday" style="display:none;">
+ <th width="75px"></th>
+ <td id="weeklycheckbox">
+ <select id="weeklyoptions" name="weeklyoptions[]" multiple="multiple" title="<?php echo $l->t("Select weekdays") ?>">
+ <?php
+ if (!isset($_['weekdays'])) {$_['weekdays'] = array();}
+ echo html_select_options($_['repeat_weekly_options'], $_['repeat_weekdays'], array('combine'=>true));
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_byyearday" style="display:none;">
+ <th width="75px"></th>
+ <td id="byyeardaycheckbox">
+ <select id="byyearday" name="byyearday[]" multiple="multiple" title="<?php echo $l->t("Select days") ?>">
+ <?php
+ if (!isset($_['repeat_byyearday'])) {$_['repeat_byyearday'] = array();}
+ echo html_select_options($_['repeat_byyearday_options'], $_['repeat_byyearday'], array('combine'=>true));
+ ?>
+ </select><?php echo $l->t('and the events day of year.'); ?>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_bymonthday" style="display:none;">
+ <th width="75px"></th>
+ <td id="bymonthdaycheckbox">
+ <select id="bymonthday" name="bymonthday[]" multiple="multiple" title="<?php echo $l->t("Select days") ?>">
+ <?php
+ if (!isset($_['repeat_bymonthday'])) {$_['repeat_bymonthday'] = array();}
+ echo html_select_options($_['repeat_bymonthday_options'], $_['repeat_bymonthday'], array('combine'=>true));
+ ?>
+ </select><?php echo $l->t('and the events day of month.'); ?>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_bymonth" style="display:none;">
+ <th width="75px"></th>
+ <td id="bymonthcheckbox">
+ <select id="bymonth" name="bymonth[]" multiple="multiple" title="<?php echo $l->t("Select months") ?>">
+ <?php
+ if (!isset($_['repeat_bymonth'])) {$_['repeat_bymonth'] = array();}
+ echo html_select_options($_['repeat_bymonth_options'], $_['repeat_bymonth'], array('combine'=>true));
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr id="advanced_byweekno" style="display:none;">
+ <th width="75px"></th>
+ <td id="bymonthcheckbox">
+ <select id="byweekno" name="byweekno[]" multiple="multiple" title="<?php echo $l->t("Select weeks") ?>">
+ <?php
+ if (!isset($_['repeat_byweekno'])) {$_['repeat_byweekno'] = array();}
+ echo html_select_options($_['repeat_byweekno_options'], $_['repeat_byweekno'], array('combine'=>true));
+ ?>
+ </select><?php echo $l->t('and the events week of year.'); ?>
+ </td>
+ </tr>
+ </table>
+ <table style="width:100%">
+ <tr>
+ <th width="75px"><?php echo $l->t('Interval'); ?>:</th>
+ <td>
+ <input style="width:350px;" type="number" min="1" size="4" max="1000" value="<?php echo isset($_['repeat_interval']) ? $_['repeat_interval'] : '1'; ?>" name="interval">
+ </td>
+ </tr>
+ <tr>
+ <th width="75px"><?php echo $l->t('End'); ?>:</th>
+ <td>
+ <select id="end" name="end">
+ <?php
+ echo html_select_options($_['repeat_end_options'], $_['repeat_end']);
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th></th>
+ <td id="byoccurrences" style="display:none;">
+ <input type="number" min="1" max="99999" id="until_count" name="byoccurrences" value="<?php echo $_['repeat_count']; ?>"><?php echo $l->t('occurrences'); ?>
+ </td>
+ </tr>
+ <tr>
+ <th></th>
+ <td id="bydate" style="display:none;">
+ <input type="text" name="bydate" value="<?php echo $_['repeat_date']; ?>">
+ </td>
+ </tr>
+ </table>
+ </div>
+ <hr>
+ <!-- support for attendees will be added in following versions -->
+ <table>
+ <tr>
+ <th width="85px"><?php echo $l->t("Location");?>:</th>
+ <td>
+ <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Location of the Event");?>" value="<?php echo isset($_['location']) ? $_['location'] : '' ?>" maxlength="100" name="location" />
+ </td>
+ </tr>
+ </table>
+ <table>
+ <tr>
+ <th width="85px" style="vertical-align: top;"><?php echo $l->t("Description");?>:</th>
+ <td>
+ <textarea style="width:350px;height: 150px;" placeholder="<?php echo $l->t("Description of the Event");?>" name="description"><?php echo isset($_['description']) ? $_['description'] : '' ?></textarea>
+ </td>
+ </tr>
+ </table>
</div>
diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php
index 56fb55d235c..fc8e0e061d9 100644
--- a/apps/calendar/templates/settings.php
+++ b/apps/calendar/templates/settings.php
@@ -27,7 +27,7 @@
$continent=$ex[0];
echo '<option value="'.$timezone.'"'.($_['timezone'] == $timezone?' selected="selected"':'').'>'.$city.'</option>';
endforeach;?>
- </select></td></tr>
+ </select><input type="checkbox" name="timezonedetection" id="timezonedetection"><label for="timezonedetection"><?php echo $l->t('Check always for changes of the timezone'); ?></label></td></tr>
<tr><td><label for="timeformat" class="bold"><?php echo $l->t('Timeformat');?></label></td><td>
<select style="display: none;" id="timeformat" title="<?php echo "timeformat"; ?>" name="timeformat">
diff --git a/apps/contacts/ajax/activation.php b/apps/contacts/ajax/activation.php
new file mode 100644
index 00000000000..f4a2c94a148
--- /dev/null
+++ b/apps/contacts/ajax/activation.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once ("../../../lib/base.php");
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+$bookid = $_POST['bookid'];
+OC_Contacts_Addressbook::setActive($bookid, $_POST['active']);
+$book = OC_Contacts_App::getAddressbook($bookid);
+
+/* is there an OC_JSON::error() ? */
+OC_JSON::success(array(
+ 'active' => OC_Contacts_Addressbook::isActive($bookid),
+ 'bookid' => $bookid,
+ 'book' => $book,
+));
diff --git a/apps/contacts/ajax/addbook.php b/apps/contacts/ajax/addbook.php
new file mode 100644
index 00000000000..36acb9af391
--- /dev/null
+++ b/apps/contacts/ajax/addbook.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+$l10n = new OC_L10N('contacts');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+$book = array(
+ 'id' => 'new',
+ 'displayname' => '',
+);
+$tmpl = new OC_Template('contacts', 'part.editaddressbook');
+$tmpl->assign('new', true);
+$tmpl->assign('addressbook', $book);
+$tmpl->printPage();
+?>
diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php
index 9d782246a0a..54c455e515f 100644
--- a/apps/contacts/ajax/addcard.php
+++ b/apps/contacts/ajax/addcard.php
@@ -61,5 +61,6 @@ foreach( $add as $propname){
$vcard->addProperty($propname, $value, $prop_parameters);
}
$id = OC_Contacts_VCard::add($aid,$vcard->serialize());
+OC_Log::write('contacts','ajax/addcard.php - adding id: '.$id,OC_Log::DEBUG);
OC_Contacts_App::renderDetails($id, $vcard);
diff --git a/apps/contacts/ajax/chooseaddressbook.php b/apps/contacts/ajax/chooseaddressbook.php
new file mode 100644
index 00000000000..b0a10bb3118
--- /dev/null
+++ b/apps/contacts/ajax/chooseaddressbook.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+$l10n = new OC_L10N('contacts');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+
+$output = new OC_TEMPLATE("contacts", "part.chooseaddressbook");
+$output -> printpage();
+?>
diff --git a/apps/contacts/ajax/contacts.php b/apps/contacts/ajax/contacts.php
new file mode 100644
index 00000000000..54ad3e4c103
--- /dev/null
+++ b/apps/contacts/ajax/contacts.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+
+$ids = OC_Contacts_Addressbook::activeIds(OC_User::getUser());
+$contacts = OC_Contacts_VCard::all($ids);
+//OC_Log::write('contacts','contacts.php: '.count($contacts).' contacts.',OC_Log::DEBUG);
+/*
+$addressbooks = OC_Contacts_Addressbook::active(OC_User::getUser());
+$contacts = array();
+foreach( $addressbooks as $addressbook ){
+ $addressbookcontacts = OC_Contacts_VCard::all($addressbook['id']);
+ foreach( $addressbookcontacts as $contact ){
+ if(is_null($contact['fullname'])){
+ continue;
+ }
+ $contacts[] = $contact;
+ }
+}
+usort($contacts,'contacts_namesort');
+*/
+$tmpl = new OC_TEMPLATE("contacts", "part.contacts");
+$tmpl->assign('contacts', $contacts);
+$page = $tmpl->fetchPage();
+
+OC_JSON::success(array('data' => array( 'page' => $page )));
+?>
diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php
new file mode 100644
index 00000000000..f94ad34e8dc
--- /dev/null
+++ b/apps/contacts/ajax/createaddressbook.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+require_once('../../../lib/base.php');
+
+$l10n = new OC_L10N('contacts');
+
+// Check if we are a user
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+
+$userid = OC_User::getUser();
+$bookid = OC_Contacts_Addressbook::add($userid, $_POST['name'], null);
+OC_Contacts_Addressbook::setActive($bookid, 1);
+$addressbook = OC_Contacts_App::getAddressbook($bookid);
+$tmpl = new OC_Template('contacts', 'part.chooseaddressbook.rowfields');
+$tmpl->assign('addressbook', $addressbook);
+OC_JSON::success(array(
+ 'page' => $tmpl->fetchPage(),
+ 'addressbook' => $addressbook,
+));
diff --git a/apps/contacts/ajax/deletebook.php b/apps/contacts/ajax/deletebook.php
index 3ede17ab886..a89c00575e9 100644
--- a/apps/contacts/ajax/deletebook.php
+++ b/apps/contacts/ajax/deletebook.php
@@ -23,11 +23,13 @@
// Init owncloud
require_once('../../../lib/base.php');
+$l10n = new OC_L10N('contacts');
// Check if we are a user
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('contacts');
-$id = $_GET['id'];
+//$id = $_GET['id'];
+$id = $_POST['id'];
$addressbook = OC_Contacts_App::getAddressbook( $id );
OC_Contacts_Addressbook::delete($id);
diff --git a/apps/contacts/ajax/editaddressbook.php b/apps/contacts/ajax/editaddressbook.php
new file mode 100644
index 00000000000..ced673ce807
--- /dev/null
+++ b/apps/contacts/ajax/editaddressbook.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+$l10n = new OC_L10N('contacts');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+$addressbook = OC_Contacts_App::getAddressbook($_GET['bookid']);
+$tmpl = new OC_Template("contacts", "part.editaddressbook");
+$tmpl->assign('new', false);
+$tmpl->assign('addressbook', $addressbook);
+$tmpl->printPage();
+?>
diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php
new file mode 100644
index 00000000000..516736cc502
--- /dev/null
+++ b/apps/contacts/ajax/updateaddressbook.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once('../../../lib/base.php');
+
+$l10n = new OC_L10N('contacts');
+
+// Check if we are a user
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('contacts');
+
+$bookid = $_POST['id'];
+OC_Contacts_Addressbook::edit($bookid, $_POST['name'], null);
+OC_Contacts_Addressbook::setActive($bookid, $_POST['active']);
+$addressbook = OC_Contacts_App::getAddressbook($bookid);
+$tmpl = new OC_Template('contacts', 'part.chooseaddressbook.rowfields');
+$tmpl->assign('addressbook', $addressbook);
+OC_JSON::success(array(
+ 'page' => $tmpl->fetchPage(),
+ 'addressbook' => $addressbook,
+));
diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css
index f351589fe12..c890be85824 100644
--- a/apps/contacts/css/styles.css
+++ b/apps/contacts/css/styles.css
@@ -1,3 +1,6 @@
+#contacts { padding-left:2px; padding-top: 5px; background: #fff; }
+#leftcontent a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; }
+#chooseaddressbook {margin-right: 170px; float: right;}
#contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;}
#contacts_details_photo { margin:.5em 0em .5em 25%; }
diff --git a/apps/contacts/export.php b/apps/contacts/export.php
new file mode 100644
index 00000000000..fd2d7da1750
--- /dev/null
+++ b/apps/contacts/export.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+require_once ("../../lib/base.php");
+OC_Util::checkLoggedIn();
+OC_Util::checkAppEnabled('contacts');
+$book = isset($_GET['bookid']) ? $_GET['bookid'] : NULL;
+$contact = isset($_GET['contactid']) ? $_GET['contactid'] : NULL;
+if(isset($book)){
+ $addressbook = OC_Contacts_App::getAddressbook($book);
+ if($addressbook['userid'] != OC_User::getUser()){
+ OC_JSON::error();
+ exit;
+ }
+ $cardobjects = OC_Contacts_VCard::all($book);
+ header('Content-Type: text/directory');
+ header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $addressbook['displayname']) . '.vcf');
+ for($i = 0;$i <= count($cardobjects); $i++){
+ echo $cardobjects[$i]['carddata'];
+ //echo '\r\n';
+ }
+}elseif(isset($contact)){
+ $data = OC_Contacts_App::getContactObject($contact);
+ $addressbookid = $data['addressbookid'];
+ $addressbook = OC_Contacts_App::getAddressbook($addressbookid);
+ if($addressbook['userid'] != OC_User::getUser()){
+ OC_JSON::error();
+ exit;
+ }
+ header('Content-Type: text/directory');
+ header('Content-Disposition: inline; filename=' . $data['fullname'] . '.vcf');
+ echo $data['carddata'];
+}
+?>
diff --git a/apps/contacts/img/person.png b/apps/contacts/img/person.png
new file mode 100644
index 00000000000..17e79196540
--- /dev/null
+++ b/apps/contacts/img/person.png
Binary files differ
diff --git a/apps/contacts/img/person.svg b/apps/contacts/img/person.svg
new file mode 100644
index 00000000000..c4842c5916b
--- /dev/null
+++ b/apps/contacts/img/person.svg
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="22"
+ height="22"
+ id="svg11300">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient3785">
+ <stop
+ id="stop3787"
+ style="stop-color:#b8b8b8;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3789"
+ style="stop-color:#878787;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6954">
+ <stop
+ id="stop6960"
+ style="stop-color:#f5f5f5;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop6962"
+ style="stop-color:#d2d2d2;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3341">
+ <stop
+ id="stop3343"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3345"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5060">
+ <stop
+ id="stop5062"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop5064"
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="24.999998"
+ cy="28.659998"
+ r="16"
+ fx="24.999998"
+ fy="28.659998"
+ id="radialGradient2871"
+ xlink:href="#linearGradient6954"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.67742373,0,0,0.19285627,-5.0162555,9.9977318)" />
+ <linearGradient
+ x1="30"
+ y1="25.084745"
+ x2="30"
+ y2="45"
+ id="linearGradient2873"
+ xlink:href="#linearGradient3785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.51613236,0,0,0.51667107,-0.98397254,-0.49180897)" />
+ <linearGradient
+ x1="29.996229"
+ y1="21.440447"
+ x2="29.996229"
+ y2="43.531425"
+ id="linearGradient2875"
+ xlink:href="#linearGradient3341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.51613236,0,0,0.51667107,-0.98397254,-0.49180897)" />
+ <radialGradient
+ cx="26.375898"
+ cy="12.31301"
+ r="8"
+ fx="26.375898"
+ fy="12.31301"
+ id="radialGradient2877"
+ xlink:href="#linearGradient6954"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.86552039,-0.07102871,0.06760608,0.84907396,-11.038912,-4.204803)" />
+ <linearGradient
+ x1="30"
+ y1="5"
+ x2="30"
+ y2="44.678879"
+ id="linearGradient2879"
+ xlink:href="#linearGradient3785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.52770326,0,0,0.53573244,-1.3310981,-1.4043014)" />
+ <linearGradient
+ x1="22"
+ y1="39"
+ x2="17"
+ y2="37.4375"
+ id="linearGradient2881"
+ xlink:href="#linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.74999995,0,0,0.43478262,-5.1276295,2.9173914)" />
+ <radialGradient
+ cx="30"
+ cy="33.1875"
+ r="4.6875"
+ fx="30"
+ fy="33.1875"
+ id="radialGradient2883"
+ xlink:href="#linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.81491924,-3.8844793e-7,1.136461e-7,0.25340272,-9.9475804,6.5902095)" />
+ <linearGradient
+ x1="22"
+ y1="39"
+ x2="17"
+ y2="37.4375"
+ id="linearGradient2885"
+ xlink:href="#linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.74999995,0,0,0.43478262,34.15,2.9173914)" />
+ <linearGradient
+ x1="30.00001"
+ y1="6.333993"
+ x2="30.00001"
+ y2="24.913183"
+ id="linearGradient2887"
+ xlink:href="#linearGradient3341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.52770326,0,0,0.53573244,-1.3310981,-1.4043014)" />
+ </defs>
+ <g
+ transform="translate(-3,-1.0000003)"
+ id="g3758">
+ <path
+ d="m 12.177403,10.099947 c 0.23753,1.124653 0.370116,1.975373 0.177421,3.100026 -1.502303,1.247697 -5.3445034,1.80835 -5.3387447,3.100025 l -0.5161321,3.875036 c 0,1.284073 3.5817448,2.325019 8.0000528,2.325019 4.418307,0 8.000053,-1.040946 8.000053,-2.325019 l -0.516134,-3.875036 c -0.0061,-1.105498 -3.870993,-1.808346 -5.354873,-3.100025 -0.126751,-1.043848 -0.02586,-2.056174 0.193549,-3.100026 l -4.645192,0 z"
+ id="path3766"
+ style="fill:url(#radialGradient2871);fill-opacity:1;stroke:url(#linearGradient2873);stroke-width:0.99989432;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 13.21875,11.09375 c 0.08722,0.856711 0.3354,1.801007 -0.04818,2.615857 -0.642554,0.728465 -1.594602,1.093826 -2.46738,1.472715 C 9.3226847,15.510467 7.7137266,16 7.9252179,16.998373 7.7834779,18.061416 7.641739,19.124458 7.5,20.1875 c 0.3063993,0.160613 1.0809439,0.584904 1.625,0.6875 2.520767,0.666947 5.16785,0.725367 7.754874,0.519516 1.511711,-0.166212 3.088649,-0.352665 4.432626,-1.113266 0.335436,-0.07362 0.107122,-0.316411 0.114936,-0.654915 -0.132062,-1.021278 -0.264124,-2.042557 -0.396186,-3.063835 -0.587648,-0.5027 -1.391296,-0.753519 -2.106391,-1.064577 -1.082782,-0.447299 -2.251468,-0.853003 -3.086912,-1.707994 -0.391617,-0.689558 -0.161473,-1.538743 -0.107324,-2.28649 0.259681,-0.52835 -0.223399,-0.401903 -0.552932,-0.409689 -0.652981,0 -1.305961,0 -1.958941,0 z"
+ id="path3742"
+ style="fill:none;stroke:url(#linearGradient2875);stroke-width:0.99989432;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ d="m 14.5,1.5422262 c -2.185818,0 -3.957774,1.67899 -3.957774,3.7501272 0.01713,0.7664876 0.08155,1.6770462 0.527701,3.750127 0.263852,0.8035986 2.617283,2.9465296 2.638517,3.2143946 0.511701,0.267865 1.319258,0.267865 1.846964,0 0,-0.267865 2.110813,-2.410796 2.374664,-3.2143946 0.502046,-2.1545496 0.500773,-2.9465283 0.527702,-3.750127 0,-2.0711372 -1.771956,-3.7501272 -3.957774,-3.7501272 z"
+ id="path3764"
+ style="fill:url(#radialGradient2877);fill-opacity:1;stroke:url(#linearGradient2879);stroke-width:1.08445191;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 10.62237,21.7 C 8.8506083,20.838176 9.6954668,18.924844 9.8723695,17.7 9.1223696,18.569566 9.5000001,21 8,21 c 1,0.355621 1.6845389,0.59817 2.62237,0.7 z"
+ id="path3848"
+ style="opacity:0.5;fill:url(#linearGradient2881);fill-opacity:1;stroke:none" />
+ <path
+ d="M 12,13.35048 C 12.366027,14.309818 13.343418,15 14.5,15 c 1.156582,0 2.133972,-0.690182 2.5,-1.64952 l -5,0 z"
+ id="path3833"
+ style="opacity:0.3;fill:url(#radialGradient2883);fill-opacity:1;stroke:none" />
+ <path
+ d="m 18.4,21.7 c 1.771762,-0.861824 0.926903,-2.775156 0.750001,-4 C 19.9,18.569566 19.52237,21 21.02237,21 c -1,0.355621 -1.684539,0.59817 -2.62237,0.7 z"
+ id="path3720"
+ style="opacity:0.5;fill:url(#linearGradient2885);fill-opacity:1;stroke:none" />
+ <path
+ d="m 14.5,2.53125 c -1.666616,0 -2.9513,1.2303173 -2.96875,2.71875 1.39e-4,0.00624 -1.45e-4,0.024997 0,0.03125 0.01647,0.7081029 0.08609,1.5272795 0.5,3.46875 -0.0051,-0.03667 0.09671,0.2041393 0.3125,0.46875 0.232433,0.2850235 0.566603,0.6083312 0.875,0.9375 0.308397,0.329169 0.598847,0.668975 0.84375,0.9375 0.09435,0.103448 0.171956,0.186905 0.25,0.28125 0.166811,0.03524 0.415249,0.03212 0.625,0 0.06182,-0.08397 0.114751,-0.159431 0.1875,-0.25 0.218248,-0.271707 0.473896,-0.575993 0.75,-0.90625 0.276104,-0.3302573 0.569207,-0.6813941 0.78125,-0.96875 0.197562,-0.2677316 0.307312,-0.503144 0.3125,-0.5 0.460701,-1.9997828 0.473735,-2.6695721 0.5,-3.46875 0,-0.010182 1.19e-4,-0.021091 0,-0.03125 C 17.4513,3.7615673 16.166616,2.53125 14.5,2.53125 z"
+ id="path3730"
+ style="fill:none;stroke:url(#linearGradient2887);stroke-width:1.08445191;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/apps/contacts/index.php b/apps/contacts/index.php
index de7b56dd1ae..5ab6f293ab4 100644
--- a/apps/contacts/index.php
+++ b/apps/contacts/index.php
@@ -21,7 +21,7 @@
*/
function contacts_namesort($a,$b){
- return strcmp($a['name'],$b['name']);
+ return strcmp($a['fullname'],$b['fullname']);
}
// Init owncloud
@@ -31,54 +31,57 @@ require_once('../../lib/base.php');
OC_Util::checkLoggedIn();
OC_Util::checkAppEnabled('contacts');
-// Check if the user has an addressbook
-$addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser());
-if( count($addressbooks) == 0){
- OC_Contacts_Addressbook::add(OC_User::getUser(),'default','Default Address Book');
- $addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser());
-}
-$prefbooks = OC_Preferences::getValue(OC_User::getUser(),'contacts','openaddressbooks',null);
-if(is_null($prefbooks)){
- $prefbooks = $addressbooks[0]['id'];
- OC_Preferences::setValue(OC_User::getUser(),'contacts','openaddressbooks',$prefbooks);
-}
+// Get active address books. This creates a default one if none exists.
+$ids = OC_Contacts_Addressbook::activeIds(OC_User::getUser());
+$contacts = OC_Contacts_VCard::all($ids);
+
+$addressbooks = OC_Contacts_Addressbook::active(OC_User::getUser());
// Load the files we need
OC_App::setActiveNavigationEntry( 'contacts_index' );
// Load a specific user?
$id = isset( $_GET['id'] ) ? $_GET['id'] : null;
-
+/*
// sort addressbooks (use contactsort)
usort($addressbooks,'contacts_namesort');
-// Addressbooks to load
-$openaddressbooks = explode(';',$prefbooks);
$contacts = array();
-foreach( $openaddressbooks as $addressbook ){
- $addressbookcontacts = OC_Contacts_VCard::all($addressbook);
+foreach( $addressbooks as $addressbook ){
+ $addressbookcontacts = OC_Contacts_VCard::all($addressbook['id']);
foreach( $addressbookcontacts as $contact ){
if(is_null($contact['fullname'])){
continue;
}
- $contacts[] = array( 'name' => $contact['fullname'], 'id' => $contact['id'] );
+ $contacts[] = $contact;
}
}
usort($contacts,'contacts_namesort');
-
+*/
$details = array();
+
+// FIXME: This cannot work..?
if( !is_null($id)/* || count($contacts)*/){
if(is_null($id)) $id = $contacts[0]['id'];
$vcard = OC_Contacts_App::getContactVCard($id);
$details = OC_Contacts_VCard::structureContact($vcard);
}
+// Include Style and Script
+OC_Util::addScript('contacts','interface');
+OC_Util::addStyle('contacts','styles');
+OC_Util::addStyle('contacts','formtastic');
+OC_Util::addScript('', 'jquery.multiselect');
+OC_Util::addStyle('', 'jquery.multiselect');
+
+$property_types = OC_Contacts_App::getAddPropertyOptions();
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
// Process the template
$tmpl = new OC_Template( 'contacts', 'index', 'user' );
+$tmpl->assign('property_types',$property_types);
$tmpl->assign('adr_types',$adr_types);
$tmpl->assign('phone_types',$phone_types);
$tmpl->assign('addressbooks', $addressbooks);
diff --git a/apps/contacts/js/LICENSE.jquery.inview b/apps/contacts/js/LICENSE.jquery.inview
new file mode 100644
index 00000000000..1ed340edbe5
--- /dev/null
+++ b/apps/contacts/js/LICENSE.jquery.inview
@@ -0,0 +1,41 @@
+Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales
+
+http://creativecommons.org/licenses/by-nc-sa/2.0/uk/
+
+You are free:
+
+ * to copy, distribute, display, and perform the work
+ * to make derivative works
+
+
+Under the following conditions:
+
+ * Attribution — You must give the original author credit.
+ Attribute this work:
+ Information
+ What does "Attribute this work" mean?
+ The page you came from contained embedded licensing metadata,
+ including how the creator wishes to be attributed for re-use.
+ You can use the HTML here to cite the work. Doing so will
+ also include metadata on your page so that others can find the
+ original work as well.
+
+ * Non-Commercial — You may not use this work for commercial
+ purposes.
+ * Share Alike — If you alter, transform, or build upon this
+ work, you may distribute the resulting work only under a
+ licence identical to this one.
+
+With the understanding that:
+
+ * Waiver — Any of the above conditions can be waived if you get
+ permission from the copyright holder.
+ * Other Rights — In no way are any of the following rights
+ affected by the license:
+ o Your fair dealing or fair use rights;
+ o The author's moral rights;
+ o Rights other persons may have either in the work itself
+ or in how the work is used, such as publicity or privacy rights.
+ * Notice — For any reuse or distribution, you must make clear to
+ others the licence terms of this work.
+
diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js
index eb81e872682..35639ef6cc7 100644
--- a/apps/contacts/js/interface.js
+++ b/apps/contacts/js/interface.js
@@ -1,3 +1,130 @@
+Contacts={
+ UI:{
+ showCardDAVUrl:function(username, bookname){
+ $('#carddav_url').val(totalurl + '/' + username + '/' + bookname);
+ $('#carddav_url').show();
+ $('#carddav_url_close').show();
+ },
+ Addressbooks:{
+ overview:function(){
+ if($('#chooseaddressbook_dialog').dialog('isOpen') == true){
+ $('#chooseaddressbook_dialog').dialog('moveToTop');
+ }else{
+ $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(){
+ $('#chooseaddressbook_dialog').dialog({
+ width : 600,
+ close : function(event, ui) {
+ $(this).dialog('destroy').remove();
+ }
+ });
+ });
+ }
+ },
+ activation:function(checkbox, bookid)
+ {
+ $.post(OC.filePath('contacts', 'ajax', 'activation.php'), { bookid: bookid, active: checkbox.checked?1:0 },
+ function(data) {
+ /*
+ * Arguments:
+ * data.status
+ * data.bookid
+ * data.active
+ */
+ if (data.status == 'success'){
+ checkbox.checked = data.active == 1;
+ Contacts.UI.Contacts.update();
+ }
+ });
+ },
+ newAddressbook:function(object){
+ var tr = $(document.createElement('tr'))
+ .load(OC.filePath('contacts', 'ajax', 'addbook.php'));
+ $(object).closest('tr').after(tr).hide();
+ /* TODO: Shouldn't there be some kinda error checking here? */
+ },
+ editAddressbook:function(object, bookid){
+ var tr = $(document.createElement('tr'))
+ .load(OC.filePath('contacts', 'ajax', 'editaddressbook.php') + "?bookid="+bookid);
+ $(object).closest('tr').after(tr).hide();
+ },
+ deleteAddressbook:function(bookid){
+ var check = confirm("Do you really want to delete this address book?");
+ if(check == false){
+ return false;
+ }else{
+ $.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid},
+ function(data) {
+ if (data.status == 'success'){
+ $('#chooseaddressbook_dialog').dialog('destroy').remove();
+ Contacts.UI.Contacts.update();
+ Contacts.UI.Addressbooks.overview();
+ } else {
+ alert('Error: ' + data.message);
+ }
+ });
+ }
+ },
+ submit:function(button, bookid){
+ var displayname = $("#displayname_"+bookid).val();
+ var active = $("#edit_active_"+bookid+":checked").length;
+ var description = $("#description_"+bookid).val();
+
+ var url;
+ if (bookid == 'new'){
+ url = OC.filePath('contacts', 'ajax', 'createaddressbook.php');
+ }else{
+ url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php');
+ }
+ $.post(url, { id: bookid, name: displayname, active: active, description: description },
+ function(data){
+ if(data.status == 'success'){
+ $(button).closest('tr').prev().html(data.page).show().next().remove();
+ }
+ });
+ Contacts.UI.Contacts.update();
+ },
+ cancel:function(button, bookid){
+ $(button).closest('tr').prev().show().next().remove();
+ }
+ },
+ Contacts:{
+ update:function(){
+ $.getJSON('ajax/contacts.php',{},function(jsondata){
+ if(jsondata.status == 'success'){
+ $('#contacts').html(jsondata.data.page);
+ }
+ else{
+ alert(jsondata.data.message);
+ }
+ });
+ /*
+ var contactlist = $('#contacts');
+ var contacts = contactlist.children('li').get();
+ //alert(contacts);
+ contacts.sort(function(a, b) {
+ var compA = $(a).text().toUpperCase();
+ var compB = $(b).text().toUpperCase();
+ return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
+ })
+ $.each(contacts, function(idx, itm) { contactlist.append(itm); });
+ */
+ setTimeout(Contacts.UI.Contacts.lazyupdate(), 500);
+ },
+ lazyupdate:function(){
+ //alert('lazyupdate');
+ $('#contacts li').live('inview', function(){
+ if (!$(this).find('a').attr('style')) {
+ //alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
+ $(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
+ }/* else {
+ alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
+ }*/
+ });
+ }
+ }
+ }
+}
+
$(document).ready(function(){
/*-------------------------------------------------------------------------
* Event handlers
@@ -79,6 +206,11 @@ $(document).ready(function(){
return false;
});
+ $('#chooseaddressbook').click(function(){
+ Contacts.UI.Addressbooks.overview();
+ return false;
+ });
+
$('#contacts_newcontact').click(function(){
$.getJSON('ajax/showaddcard.php',{},function(jsondata){
if(jsondata.status == 'success'){
@@ -159,4 +291,25 @@ $(document).ready(function(){
});
$('#contacts_addcardform select').chosen();
+
+ $('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
+ if (isInView) { //NOTE: I've kept all conditions for future reference ;-)
+ // element is now visible in the viewport
+ if (visiblePartY == 'top') {
+ // top part of element is visible
+ } else if (visiblePartY == 'bottom') {
+ // bottom part of element is visible
+ } else {
+ // whole part of element is visible
+ if (!$(this).find('a').attr('style')) {
+ //alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
+ $(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
+ }/* else {
+ alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
+ }*/
+ }
+ } else {
+ // element has gone out of viewport
+ }
+ });
});
diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js
new file mode 100644
index 00000000000..a38ab164977
--- /dev/null
+++ b/apps/contacts/js/jquery.inview.js
@@ -0,0 +1,118 @@
+/**
+ * author Christopher Blum
+ * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
+ * - forked from http://github.com/zuk/jquery.inview/
+ */
+(function ($) {
+ var inviewObjects = {}, viewportSize, viewportOffset,
+ d = document, w = window, documentElement = d.documentElement, expando = $.expando;
+
+ $.event.special.inview = {
+ add: function(data) {
+ inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) };
+ },
+
+ remove: function(data) {
+ try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {}
+ }
+ };
+
+ function getViewportSize() {
+ var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
+
+ // if this is correct then return it. iPad has compat Mode, so will
+ // go into check clientHeight/clientWidth (which has the wrong value).
+ if (!size.height) {
+ mode = d.compatMode;
+ if (mode || !$.support.boxModel) { // IE, Gecko
+ domObject = mode === 'CSS1Compat' ?
+ documentElement : // Standards
+ d.body; // Quirks
+ size = {
+ height: domObject.clientHeight,
+ width: domObject.clientWidth
+ };
+ }
+ }
+
+ return size;
+ }
+
+ function getViewportOffset() {
+ return {
+ top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
+ left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
+ };
+ }
+
+ function checkInView() {
+ var $elements = $(), elementsLength, i = 0;
+
+ $.each(inviewObjects, function(i, inviewObject) {
+ var selector = inviewObject.data.selector,
+ $element = inviewObject.$element;
+ $elements = $elements.add(selector ? $element.find(selector) : $element);
+ });
+
+ elementsLength = $elements.length;
+ if (elementsLength) {
+ viewportSize = viewportSize || getViewportSize();
+ viewportOffset = viewportOffset || getViewportOffset();
+
+ for (; i<elementsLength; i++) {
+ // Ignore elements that are not in the DOM tree
+ if (!$.contains(documentElement, $elements[i])) {
+ continue;
+ }
+
+ var $element = $($elements[i]),
+ elementSize = { height: $element.height(), width: $element.width() },
+ elementOffset = $element.offset(),
+ inView = $element.data('inview'),
+ visiblePartX,
+ visiblePartY,
+ visiblePartsMerged;
+
+ // Don't ask me why because I haven't figured out yet:
+ // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
+ // Even though it sounds weird:
+ // It seems that the execution of this function is interferred by the onresize/onscroll event
+ // where viewportOffset and viewportSize are unset
+ if (!viewportOffset || !viewportSize) {
+ return;
+ }
+
+ if (elementOffset.top + elementSize.height > viewportOffset.top &&
+ elementOffset.top < viewportOffset.top + viewportSize.height &&
+ elementOffset.left + elementSize.width > viewportOffset.left &&
+ elementOffset.left < viewportOffset.left + viewportSize.width) {
+ visiblePartX = (viewportOffset.left > elementOffset.left ?
+ 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ?
+ 'left' : 'both');
+ visiblePartY = (viewportOffset.top > elementOffset.top ?
+ 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ?
+ 'top' : 'both');
+ visiblePartsMerged = visiblePartX + "-" + visiblePartY;
+ if (!inView || inView !== visiblePartsMerged) {
+ $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]);
+ }
+ } else if (inView) {
+ $element.data('inview', false).trigger('inview', [false]);
+ }
+ }
+ }
+ }
+
+ $(w).bind("scroll resize", function() {
+ viewportSize = viewportOffset = null;
+ });
+
+ // Use setInterval in order to also make sure this captures elements within
+ // "overflow:scroll" elements or elements that appeared in the dom tree due to
+ // dom manipulation and reflow
+ // old: $(window).scroll(checkInView);
+ //
+ // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
+ // intervals while the user scrolls. Therefore the inview event might fire a bit late there
+ setInterval(checkInView, 250);
+})(jQuery); \ No newline at end of file
diff --git a/apps/contacts/js/jquery.inview.txt b/apps/contacts/js/jquery.inview.txt
new file mode 100644
index 00000000000..c53dbd1d97c
--- /dev/null
+++ b/apps/contacts/js/jquery.inview.txt
@@ -0,0 +1,15 @@
+jQuery.inview is licensed Attribution-Non-Commercial-Share Alike 2.0 but the
+conditions has been waived by the author in the following tweet:
+
+https://twitter.com/#!/ChristopherBlum/status/148382899887013888
+
+Saying:
+
+Thomas Tanghus @tanghus 18 Dec. 2011
+
+@ChristopherBlum Hi. Is it OK if I use https://github.com/protonet/jquery.inview in ownCloud? Preferably under an AGPL license ;-) owncloud.org
+
+
+Christopher Blum Christopher Blum @ChristopherBlum 18 Dec. 2011
+
+@tanghus Feel free to! :)
diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php
index 87477ed7ed4..78792f5f948 100644
--- a/apps/contacts/lib/addressbook.php
+++ b/apps/contacts/lib/addressbook.php
@@ -44,7 +44,7 @@ class OC_Contacts_Addressbook{
* @return array
*/
public static function all($uid){
- $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ?' );
+ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ? ORDER BY displayname' );
$result = $stmt->execute(array($uid));
$addressbooks = array();
@@ -140,12 +140,131 @@ class OC_Contacts_Addressbook{
return true;
}
+ public static function cleanArray($array, $remove_null_number = true){
+ $new_array = array();
+
+ $null_exceptions = array();
+
+ foreach ($array as $key => $value){
+ $value = trim($value);
+
+ if($remove_null_number){
+ $null_exceptions[] = '0';
+ }
+
+ if(!in_array($value, $null_exceptions) && $value != "") {
+ $new_array[] = $value;
+ }
+ }
+ return $new_array;
+ }
+
+ /**
+ * @brief Get active addressbooks for a user.
+ * @param integer $uid User id. If null current user will be used.
+ * @return array
+ */
+ public static function activeIds($uid = null){
+ if(is_null($uid)){
+ $uid = OC_User::getUser();
+ }
+ $prefbooks = OC_Preferences::getValue($uid,'contacts','openaddressbooks',null);
+ if(is_null($prefbooks)){
+ $addressbooks = OC_Contacts_Addressbook::all($uid);
+ if(count($addressbooks) == 0){
+ OC_Contacts_Addressbook::add($uid,'default','Default Address Book');
+ $addressbooks = OC_Contacts_Addressbook::all($uid);
+ }
+ $prefbooks = $addressbooks[0]['id'];
+ OC_Preferences::setValue($uid,'contacts','openaddressbooks',$prefbooks);
+ }
+ return explode(';',$prefbooks);
+ }
+
+ /**
+ * @brief Returns the list of active addressbooks for a specific user.
+ * @param string $uid
+ * @return array
+ */
+ public static function active($uid){
+ $active = self::activeIds($uid);
+ $addressbooks = array();
+ $ids_sql = join(',', array_fill(0, count($active), '?'));
+ $prep = 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id IN ('.$ids_sql.') ORDER BY displayname';
+ try {
+ $stmt = OC_DB::prepare( $prep );
+ $result = $stmt->execute($active);
+ } catch(Exception $e) {
+ OC_Log::write('contacts','OC_Contacts_Addressbook:active:, exception: '.$e->getMessage(),OC_Log::DEBUG);
+ OC_Log::write('contacts','OC_Contacts_Addressbook:active, ids: '.join(',', $active),OC_Log::DEBUG);
+ OC_Log::write('contacts','OC_Contacts_Addressbook::active, SQL:'.$prep,OC_Log::DEBUG);
+ }
+
+ while( $row = $result->fetchRow()){
+ $addressbooks[] = $row;
+ }
+ /*
+ foreach( $active as $aid ){
+ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ? ORDER BY displayname' );
+ $result = $stmt->execute(array($aid,));
+
+ while( $row = $result->fetchRow()){
+ $addressbooks[] = $row;
+ }
+ }*/
+
+ return $addressbooks;
+ }
+
+ /**
+ * @brief Activates an addressbook
+ * @param integer $id
+ * @param integer $name
+ * @return boolean
+ */
+ public static function setActive($id,$active){
+ // Need these ones for checking uri
+ //$addressbook = self::find($id);
+
+ if(is_null($id)){
+ $id = 0;
+ }
+
+ $openaddressbooks = self::activeIds();
+ if($active) {
+ if(!in_array($id, $openaddressbooks)) {
+ $openaddressbooks[] = $id;
+ }
+ } else {
+ if(in_array($id, $openaddressbooks)) {
+ unset($openaddressbooks[array_search($id, $openaddressbooks)]);
+ }
+ }
+ $openaddressbooks = self::cleanArray($openaddressbooks, false);
+ sort($openaddressbooks, SORT_NUMERIC);
+ // FIXME: I alway end up with a ';' prepending when imploding the array..?
+ OC_Preferences::setValue(OC_User::getUser(),'contacts','openaddressbooks',implode(';', $openaddressbooks));
+
+ return true;
+ }
+
+ /**
+ * @brief Checks if an addressbook is active.
+ * @param integer $id ID of the address book.
+ * @return boolean
+ */
+ public static function isActive($id){
+ //OC_Log::write('contacts','OC_Contacts_Addressbook::isActive('.$id.'):'.in_array($id, self::activeIds()), OC_Log::DEBUG);
+ return in_array($id, self::activeIds());
+ }
+
/**
* @brief removes an address book
* @param integer $id
* @return boolean
*/
public static function delete($id){
+ self::setActive($id, false);
$stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' );
$stmt->execute(array($id));
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
index ba086e4aca8..79e00920a65 100644
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -38,7 +38,7 @@ class OC_Contacts_App{
public static function getAddressbook($id){
$addressbook = OC_Contacts_Addressbook::find( $id );
- if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){
+ if( $addressbook === false || $addressbook['userid'] != OC_User::getUser()){
OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('This is not your addressbook.')))); // Same here (as with the contact error). Could this error be improved?
exit();
}
diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php
index a573f40f7d9..beb291b481e 100644
--- a/apps/contacts/lib/vcard.php
+++ b/apps/contacts/lib/vcard.php
@@ -47,15 +47,27 @@ class OC_Contacts_VCard{
* ['carddata']
*/
public static function all($id){
- $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ?' );
- $result = $stmt->execute(array($id));
-
- $addressbooks = array();
+ if(is_array($id)) {
+ $id_sql = join(',', array_fill(0, count($id), '?'));
+ $prep = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid IN ('.$id_sql.') ORDER BY fullname';
+ try {
+ $stmt = OC_DB::prepare( $prep );
+ $result = $stmt->execute($id);
+ } catch(Exception $e) {
+ OC_Log::write('contacts','OC_Contacts_VCard:all:, exception: '.$e->getMessage(),OC_Log::DEBUG);
+ OC_Log::write('contacts','OC_Contacts_VCard:all, ids: '.join(',', $id),OC_Log::DEBUG);
+ OC_Log::write('contacts','SQL:'.$prep,OC_Log::DEBUG);
+ }
+ } else {
+ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? ORDER BY fullname' );
+ $result = $stmt->execute(array($id));
+ }
+ $cards = array();
while( $row = $result->fetchRow()){
- $addressbooks[] = $row;
+ $cards[] = $row;
}
- return $addressbooks;
+ return $cards;
}
/**
diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php
index 649c4807dd5..90143f25fa6 100644
--- a/apps/contacts/templates/index.php
+++ b/apps/contacts/templates/index.php
@@ -1,16 +1,21 @@
<?php // Include Style and Script
-OC_Util::addScript('contacts','interface');
+//OC_Util::addScript('contacts','interface'); // this line caused entry duplication, cause contacts/index.php already inlcudes it
+OC_Util::addScript('contacts','jquery.inview');
OC_Util::addStyle('contacts','styles');
OC_Util::addStyle('contacts','formtastic');
?>
+<script type='text/javascript'>
+ var totalurl = '<?php echo OC_Helper::linkTo('contacts', 'carddav.php', null, true); ?>/addressbooks';
+</script>
<div id="controls">
<form>
<input type="button" id="contacts_newcontact" value="<?php echo $l->t('Add Contact'); ?>">
+ <input type="button" id="chooseaddressbook" value="<?php echo $l->t('Address Books'); ?>">
</form>
</div>
<div id="leftcontent" class="leftcontent">
- <ul>
+ <ul id="contacts">
<?php echo $this->inc("part.contacts"); ?>
</ul>
</div>
@@ -24,3 +29,9 @@ OC_Util::addStyle('contacts','formtastic');
}
?>
</div>
+<!-- Dialogs -->
+<div id="dialog_holder"></div>
+<div id="parsingfail_dialog" title="Parsing Fail">
+ <?php echo $l->t("There was a fail, while parsing the file."); ?>
+</div>
+<!-- End of Dialogs -->
diff --git a/apps/contacts/templates/part.chooseaddressbook.php b/apps/contacts/templates/part.chooseaddressbook.php
new file mode 100644
index 00000000000..ba008837f0e
--- /dev/null
+++ b/apps/contacts/templates/part.chooseaddressbook.php
@@ -0,0 +1,24 @@
+<div id="chooseaddressbook_dialog" title="<?php echo $l->t("Choose active Address Books"); ?>">
+<table width="100%" style="border: 0;">
+<?php
+$option_addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser());
+for($i = 0; $i < count($option_addressbooks); $i++){
+ echo "<tr>";
+ $tmpl = new OC_Template('contacts', 'part.chooseaddressbook.rowfields');
+ $tmpl->assign('addressbook', $option_addressbooks[$i]);
+ $tmpl->assign('active', OC_Contacts_Addressbook::isActive($option_addressbooks[$i]['id']));
+ $tmpl->printpage();
+ echo "</tr>";
+}
+?>
+<tr>
+ <td colspan="5">
+ <a href="#" onclick="Contacts.UI.Addressbooks.newAddressbook(this);"><?php echo $l->t('New Address Book') ?></a>
+ </td>
+</tr>
+<tr>
+ <td colspan="5">
+ <p style="margin: 0 auto;width: 90%;"><input style="display:none;width: 90%;float: left;" type="text" id="carddav_url" onmouseover="$('#carddav_url').select();" title="<?php echo $l->t("CardDav Link"); ?>"><img id="carddav_url_close" style="height: 20px;vertical-align: middle;display: none;" src="../../core/img/actions/delete.svg" alt="close" onclick="$('#carddav_url').hide();$('#carddav_url_close').hide();"/></p>
+ </td>
+</tr>
+</table>
diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php
new file mode 100644
index 00000000000..f612e39ecaf
--- /dev/null
+++ b/apps/contacts/templates/part.chooseaddressbook.rowfields.php
@@ -0,0 +1,5 @@
+<?php
+
+ echo "<td width=\"20px\"><input id=\"active_" . $_['addressbook']["id"] . "\" type=\"checkbox\" onClick=\"Contacts.UI.Addressbooks.activation(this, " . $_['addressbook']["id"] . ")\"" . (OC_Contacts_Addressbook::isActive($_['addressbook']["id"]) ? ' checked="checked"' : '') . "></td>";
+ echo "<td><label for=\"active_" . $_['addressbook']["id"] . "\">" . $_['addressbook']["displayname"] . "</label></td>";
+ echo "<td width=\"20px\"><a href=\"#\" onclick=\"Contacts.UI.showCardDAVUrl('" . OC_User::getUser() . "', '" . $_['addressbook']["uri"] . "');\" title=\"" . $l->t("CardDav Link") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/public.svg\"></a></td><td width=\"20px\"><a href=\"export.php?bookid=" . $_['addressbook']["id"] . "\" title=\"" . $l->t("Download") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/download.svg\"></a></td><td width=\"20px\"><a href=\"#\" title=\"" . $l->t("Edit") . "\" class=\"action\" onclick=\"Contacts.UI.Addressbooks.editAddressbook(this, " . $_['addressbook']["id"] . ");\"><img class=\"svg action\" src=\"../../core/img/actions/rename.svg\"></a></td><td width=\"20px\"><a href=\"#\" onclick=\"Contacts.UI.Addressbooks.deleteAddressbook('" . $_['addressbook']["id"] . "');\" title=\"" . $l->t("Delete") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/delete.svg\"></a></td>";
diff --git a/apps/contacts/templates/part.contacts.php b/apps/contacts/templates/part.contacts.php
index 6664a3671ac..8d89e9c7ad1 100644
--- a/apps/contacts/templates/part.contacts.php
+++ b/apps/contacts/templates/part.contacts.php
@@ -1,3 +1,3 @@
<?php foreach( $_['contacts'] as $contact ): ?>
- <li data-id="<?php echo $contact['id']; ?>"><a href="index.php?id=<?php echo $contact['id']; ?>"><?php echo $contact['name']; ?></a> </li>
+ <li book-id="<?php echo $contact['addressbookid']; ?>" data-id="<?php echo $contact['id']; ?>"><a href="index.php?id=<?php echo $contact['id']; ?>"><?php echo $contact['fullname']; ?></a> </li>
<?php endforeach; ?>
diff --git a/apps/contacts/templates/part.editaddressbook.php b/apps/contacts/templates/part.editaddressbook.php
new file mode 100644
index 00000000000..cb1371731b1
--- /dev/null
+++ b/apps/contacts/templates/part.editaddressbook.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+?>
+<td id="<?php echo $_['new'] ? 'new' : 'edit' ?>addressbook_dialog" title="<?php echo $_['new'] ? $l->t("New Address Book") : $l->t("Edit Address Book"); ?>" colspan="6">
+<table width="100%" style="border: 0;">
+<tr>
+ <th><?php echo $l->t('Displayname') ?></th>
+ <td>
+ <input id="displayname_<?php echo $_['addressbook']['id'] ?>" type="text" value="<?php echo $_['addressbook']['displayname'] ?>">
+ </td>
+</tr>
+<?php if (!$_['new']): ?>
+<tr>
+ <td></td>
+ <td>
+ <input id="edit_active_<?php echo $_['addressbook']['id'] ?>" type="checkbox"<?php echo OC_Contacts_Addressbook::isActive($_['addressbook']['id']) ? ' checked="checked"' : '' ?>>
+ <label for="edit_active_<?php echo $_['addressbook']['id'] ?>">
+ <?php echo $l->t('Active') ?>
+ </label>
+ </td>
+</tr>
+<?php endif; ?>
+</table>
+<input style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.submit(this, <?php echo $_['new'] ? "'new'" : $_['addressbook']['id'] ?>);" value="<?php echo $_['new'] ? $l->t("Save") : $l->t("Submit"); ?>">
+<input style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.cancel(this, <?php echo $_['new'] ? "'new'" : $_['addressbook']['id'] ?>);" value="<?php echo $l->t("Cancel"); ?>">
+</td>
diff --git a/apps/contacts/templates/part.property.php b/apps/contacts/templates/part.property.php
index 6264f296743..d930a9ca99d 100644
--- a/apps/contacts/templates/part.property.php
+++ b/apps/contacts/templates/part.property.php
@@ -20,7 +20,7 @@
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
</p>
<?php elseif($_['property']['name'] == 'TEL'): ?>
- <p class="contacts_property_name"><?php echo $_['property']['parameters']['PREF'] ? $l->t('Preferred').' ' : '' ?><?php echo $l->t('Phone'); ?></p>
+ <p class="contacts_property_name"><?php echo (isset($_['property']['parameters']['PREF']) && $_['property']['parameters']['PREF']) ? $l->t('Preferred').' ' : '' ?><?php echo $l->t('Phone'); ?></p>
<p class="contacts_property_data">
<?php echo $_['property']['value']; ?>
<?php if(isset($_['property']['parameters']['TYPE']) && !empty($_['property']['parameters']['TYPE'])): ?>
diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php
new file mode 100644
index 00000000000..bf0a6e96a5d
--- /dev/null
+++ b/apps/contacts/thumbnail.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * ownCloud - Addressbook
+ *
+ * @author Jakob Sack
+ * @copyright 2011 Jakob Sack mail@jakobsack.de
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Init owncloud
+require_once('../../lib/base.php');
+OC_Util::checkLoggedIn();
+OC_Util::checkAppEnabled('contacts');
+
+if(!function_exists('imagecreatefromjpeg')) {
+ OC_Log::write('contacts','GD module not installed',OC_Log::ERROR);
+ header('Content-Type: image/png');
+ // TODO: Check if it works to read the file and echo the content.
+ return 'img/person.png';
+}
+
+function getStandardImage(){
+ $src_img = imagecreatefrompng('img/person.png');
+ header('Content-Type: image/png');
+ imagepng($src_img);
+ imagedestroy($src_img);
+}
+
+
+$id = $_GET['id'];
+
+$l10n = new OC_L10N('contacts');
+
+$card = OC_Contacts_VCard::find( $id );
+if( $card === false ){
+ echo $l10n->t('Contact could not be found.');
+ exit();
+}
+
+$addressbook = OC_Contacts_Addressbook::find( $card['addressbookid'] );
+if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){
+ echo $l10n->t('This is not your contact.'); // This is a weird error, why would it come up? (Better feedback for users?)
+ exit();
+}
+
+$content = OC_VObject::parse($card['carddata']);
+
+// invalid vcard
+if( is_null($content)){
+ echo $l10n->t('This card is not RFC compatible.');
+ exit();
+}
+
+// define the width and height for the thumbnail
+// note that theese dimmensions are considered the maximum dimmension and are not fixed,
+// because we have to keep the image ratio intact or it will be deformed
+$thumbnail_width = 23;
+$thumbnail_height = 23;
+
+// Photo :-)
+foreach($content->children as $child){
+ if($child->name == 'PHOTO'){
+ foreach($child->parameters as $parameter){
+ if( $parameter->name == 'TYPE' ){
+ $mime = $parameter->value;
+ }
+ }
+ $data = base64_decode($child->value);
+ $src_img = imagecreatefromstring($data);
+ if ($src_img !== false) {
+ //gets the dimmensions of the image
+ $width_orig=imageSX($src_img);
+ $height_orig=imageSY($src_img);
+ $ratio_orig = $width_orig/$height_orig;
+
+ if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
+ $new_height = $thumbnail_width/$ratio_orig;
+ $new_width = $thumbnail_width;
+ } else {
+ $new_width = $thumbnail_height*$ratio_orig;
+ $new_height = $thumbnail_height;
+ }
+
+ $x_mid = $new_width/2; //horizontal middle
+ $y_mid = $new_height/2; //vertical middle
+
+ $process = imagecreatetruecolor(round($new_width), round($new_height));
+ if ($process == false) {
+ getStandardImage();
+ //echo 'Error creating process image: '.$new_width.'x'.$new_height;
+ OC_Log::write('contacts','Error creating process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR);
+ imagedestroy($process);
+ imagedestroy($src_img);
+ exit();
+ }
+
+ imagecopyresampled($process, $src_img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
+ if ($process == false) {
+ getStandardImage();
+ //echo 'Error resampling process image: '.$new_width.'x'.$new_height;
+ OC_Log::write('contacts','Error resampling process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR);
+ imagedestroy($process);
+ imagedestroy($src_img);
+ exit();
+ }
+ $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
+ if ($process == false) {
+ getStandardImage();
+ //echo 'Error creating thumb image: '.$thumbnail_width.'x'.$thumbnail_height;
+ OC_Log::write('contacts','Error creating thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR);
+ imagedestroy($process);
+ imagedestroy($src_img);
+ exit();
+ }
+ imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);
+ if ($thumb !== false) {
+ header('Content-Type: image/png');
+ imagepng($thumb);
+ } else {
+ getStandardImage();
+ OC_Log::write('contacts','Error resampling thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR);
+ //echo 'An error occurred resampling thumb.';
+ }
+ imagedestroy($thumb);
+ imagedestroy($process);
+ imagedestroy($src_img);
+ }
+ else {
+ getStandardImage();
+ }
+ exit();
+ }
+}
+getStandardImage();
+
+// Not found :-(
+//echo $l10n->t('This card does not contain a photo.');
diff --git a/apps/files_pdfviewer/appinfo/app.php b/apps/files_pdfviewer/appinfo/app.php
new file mode 100755
index 00000000000..a446b4caa41
--- /dev/null
+++ b/apps/files_pdfviewer/appinfo/app.php
@@ -0,0 +1,9 @@
+<?php
+//load the required files
+//OC_Util::addStyle( 'files_texteditor', 'style' );
+//OC_Util::addScript( 'files_texteditor', 'editor');
+OC_Util::addScript( 'files_pdfviewer', 'viewer');
+OC_Util::addStyle( 'files_pdfviewer', 'viewer');
+OC_Util::addScript( 'files_pdfviewer', 'pdfjs/build/pdf');
+OC_Util::addScript( 'files_pdfviewer', 'pdfview');
+?>
diff --git a/apps/files_pdfviewer/appinfo/info.xml b/apps/files_pdfviewer/appinfo/info.xml
new file mode 100755
index 00000000000..86a6c3f22f7
--- /dev/null
+++ b/apps/files_pdfviewer/appinfo/info.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<info>
+ <id>files_pdfviewer</id>
+ <name>PDF viewer (pdfjs-based)</name>
+ <version>0.1</version>
+ <licence>GPL</licence>
+ <author>Joan Creus</author>
+ <require>2</require>
+ <default_enable/>
+</info>
diff --git a/apps/files_pdfviewer/css/history.png b/apps/files_pdfviewer/css/history.png
new file mode 100755
index 00000000000..afa0e4ab70f
--- /dev/null
+++ b/apps/files_pdfviewer/css/history.png
Binary files differ
diff --git a/apps/files_pdfviewer/css/style.css b/apps/files_pdfviewer/css/style.css
new file mode 100755
index 00000000000..9ad6eeaa814
--- /dev/null
+++ b/apps/files_pdfviewer/css/style.css
@@ -0,0 +1,27 @@
+#editor{
+ position: absoloute;
+ display: block;
+ top: 80px;
+ left: 160px;
+}
+#editorwrapper{
+ position: absoloute;
+ height: 0;
+ width: 0;
+ top: 41px;
+ left: 160px;
+ display: none;
+}
+#editor_close{
+ margin-left: auto;
+ margin-right: 167px;
+ display: block;
+}
+#editor_save{
+ margin-left: 7px;
+ float: left;
+}
+#saving_icon{
+ margin-top: 3px;
+ float: left;
+} \ No newline at end of file
diff --git a/apps/files_pdfviewer/css/viewer.css b/apps/files_pdfviewer/css/viewer.css
new file mode 100755
index 00000000000..cbab9e70dc2
--- /dev/null
+++ b/apps/files_pdfviewer/css/viewer.css
@@ -0,0 +1,277 @@
+/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- /
+/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */
+
+#viewer {
+ background-color: #929292;
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;
+ /*margin: 0px;*/
+ padding: 0px;
+ /*position:absolute;*/
+}
+
+[hidden] {
+ display: none;
+}
+
+.separator {
+ display: inline;
+ border-left: 1px solid #d3d3d3;
+ border-right: 1px solid #fff;
+ height: 10px;
+ width:0px;
+ margin: 4px;
+}
+
+#controls2 > a > img {
+ margin: 4px;
+ height: 10px;
+}
+
+#controls2 > button {
+ line-height: 10px;
+}
+
+#controls2 > button > img {
+ width: 10px;
+ height: 10px;
+}
+
+#controls2 > button[disabled] > img {
+ opacity: 0.5;
+}
+
+#pageNumber {
+ text-align: right;
+}
+
+span#info {
+ display: none;
+}
+
+@-moz-document regexp("http:.*debug=1.*") {
+ span#info {
+ display: inline-block;
+ }
+}
+
+/* === Sidebar === */
+#sidebar {
+ position: fixed;
+ width: 350px;
+ top: 62px;
+ bottom: 18px;
+ left: -290px;
+ transition: left 0.25s ease-in-out 1s;
+ -moz-transition: left 0.25s ease-in-out 1s;
+ -webkit-transition: left 0.25s ease-in-out 1s;
+ z-index: 1;
+}
+
+#sidebar:hover {
+ left: 0px;
+ transition: left 0.25s ease-in-out 0s;
+ -moz-transition: left 0.25s ease-in-out 0s;
+ -webkit-transition: left 0.25s ease-in-out 0s;
+}
+
+#sidebarBox {
+ background-color: rgba(0, 0, 0, 0.7);
+ width: 300px;
+ height: 100%;
+ border-top-right-radius: 8px;
+ border-bottom-right-radius: 8px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ box-shadow: 0px 2px 8px #000;
+ -moz-box-shadow: 0px 2px 8px #000;
+ -webkit-box-shadow: 0px 2px 8px #000;
+}
+
+#sidebarScrollView {
+ position: absolute;
+ overflow: hidden;
+ overflow-y: auto;
+ top: 10px;
+ bottom: 10px;
+ left: 10px;
+ width: 280px;
+}
+
+.thumbnail {
+ width: 134px;
+ height: 134px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ margin-left:auto;
+ margin-right:auto;
+ line-height: 134px;
+ text-align: center;
+ overflow: hidden;
+}
+
+.thumbnail:not([data-loaded]) {
+ background-color: gray;
+}
+
+.thumbnail > canvas {
+ vertical-align: middle;
+ display: inline-block;
+}
+
+#outlineScrollView {
+ position: absolute;
+ background-color: #fff;
+ overflow: auto;
+ top: 10px;
+ bottom: 10px;
+ left: 10px;
+ width: 280px;
+}
+
+#outlineView {
+ padding-top: 4px;
+ padding-bottom: 100px;
+ padding-left: 6px;
+ padding-right: 6px;
+ font-size: smaller;
+}
+
+.outlineItem > .outlineItems {
+ margin-left: 20px;
+}
+
+.outlineItem > a {
+ text-decoration: none;
+ color: black;
+}
+
+.outlineItem > a:hover {
+ background: #ff0;
+ box-shadow: 0px 2px 10px #ff0;
+}
+
+#sidebarControls {
+ position:absolute;
+ width: 120px;
+ height: 32px;
+ left: 15px;
+ bottom: 35px;
+}
+
+#sidebarControls > button {
+ box-shadow: 0px 4px 10px #000;
+ -moz-box-shadow: 0px 4px 10px #000;
+ -webkit-box-shadow: 0px 4px 10px #000;
+}
+
+#sidebarControls > button > img {
+ width: 32px;
+ height: 32px;
+}
+
+#sidebarControls > button[disabled] > img {
+ opacity: 0.5;
+}
+
+#sidebarControls > button[data-selected] {
+ box-shadow: 0px 4px 10px #ff0;
+ -moz-box-shadow: 0px 4px 10px #ff0;
+ -webkit-box-shadow: 0px 4px 10px #ff0;
+}
+
+/* === Content view === */
+canvas {
+ margin: auto;
+ display: block;
+}
+
+.page {
+ width: 816px;
+ height: 1056px;
+ margin: 10px auto;
+ position: relative;
+ overflow: hidden;
+ box-shadow: 0px 4px 10px #000;
+ -moz-box-shadow: 0px 4px 10px #000;
+ -webkit-box-shadow: 0px 4px 10px #000;
+ background-color: white;
+}
+
+.page > a {
+ display: block;
+ position: absolute;
+}
+
+.page > a:hover {
+ opacity: 0.2;
+ background: #ff0;
+ box-shadow: 0px 2px 10px #ff0;
+ -moz-box-shadow: 0px 2px 10px #ff0;
+ -webkit-box-shadow: 0px 2px 10px #ff0;
+}
+
+#viewer {
+ /*overflow:auto;*/
+ margin: 6.3em 0 0 0;
+ margin-right:12.5em;
+ padding: 8px 0px;
+ position:static;
+ height:100%;
+ width:100%;
+ text-align:center;
+}
+
+#sidebarView canvas:hover {
+ background: #ff0;
+ box-shadow: 0px 2px 10px #ff0;
+ -moz-box-shadow: 0px 2px 10px #ff0;
+ -webkit-box-shadow: 0px 2px 10px #ff0;
+}
+
+#pageWidthOption {
+ border-top: 1px solid black;
+}
+
+#customScaleOption {
+ display: none;
+}
+
+/* === Printed media overrides === */
+@media print {
+ #sidebar {
+ display: none;
+ }
+
+ #controls2 {
+ display: none;
+ }
+
+ #viewer {
+ margin: 0;
+ padding: 0;
+ }
+
+ .page {
+ display: none;
+ margin: 0;
+ }
+
+ .page canvas {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ }
+
+ .page[data-loaded] {
+ display: block;
+ page-break-after: always;
+ }
+}
+
+#loading {
+ margin: 100px 0;
+ text-align: center;
+}
+
diff --git a/apps/files_pdfviewer/js/pdfjs/LICENSE b/apps/files_pdfviewer/js/pdfjs/LICENSE
new file mode 100755
index 00000000000..f8a84820570
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/LICENSE
@@ -0,0 +1,30 @@
+
+ Copyright (c) 2011 Mozilla Foundation
+
+ Contributors: Andreas Gal <gal@mozilla.com>
+ Chris G Jones <cjones@mozilla.com>
+ Shaon Barman <shaon.barman@gmail.com>
+ Vivien Nicolas <21@vingtetun.org>
+ Justin D'Arcangelo <justindarc@gmail.com>
+ Yury Delendik
+ Kalervo Kujala
+ Adil Allawi <@ironymark>
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
diff --git a/apps/files_pdfviewer/js/pdfjs/build/pdf.js b/apps/files_pdfviewer/js/pdfjs/build/pdf.js
new file mode 100755
index 00000000000..3447358d3bb
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/build/pdf.js
@@ -0,0 +1,27022 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+var PDFJS = {};
+
+(function pdfjsWrapper() {
+ // Use strict in our context only - users might not want it
+ 'use strict';
+
+ PDFJS.build = 'PDFJSSCRIPT_BUNDLE_VER';
+
+ // Files are inserted below - see Makefile
+ /* PDFJSSCRIPT_INCLUDE_ALL */
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var ERRORS = 0, WARNINGS = 1, TODOS = 5;
+var verbosity = WARNINGS;
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+ globalScope.PDFJS = {};
+}
+
+// getPdf()
+// Convenience function to perform binary Ajax GET
+// Usage: getPdf('http://...', callback)
+// getPdf({
+// url:String ,
+// [,progress:Function, error:Function]
+// },
+// callback)
+function getPdf(arg, callback) {
+ var params = arg;
+ if (typeof arg === 'string')
+ params = { url: arg };
+
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', params.url);
+ xhr.mozResponseType = xhr.responseType = 'arraybuffer';
+ xhr.expected = (document.URL.indexOf('file:') === 0) ? 0 : 200;
+
+ if ('progress' in params)
+ xhr.onprogress = params.progress || undefined;
+
+ if ('error' in params)
+ xhr.onerror = params.error || undefined;
+
+ xhr.onreadystatechange = function getPdfOnreadystatechange() {
+ if (xhr.readyState === 4 && xhr.status === xhr.expected) {
+ var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
+ xhr.responseArrayBuffer || xhr.response);
+ callback(data);
+ }
+ };
+ xhr.send(null);
+}
+globalScope.PDFJS.getPdf = getPdf;
+
+var Page = (function pagePage() {
+ function constructor(xref, pageNumber, pageDict, ref) {
+ this.pageNumber = pageNumber;
+ this.pageDict = pageDict;
+ this.stats = {
+ create: Date.now(),
+ compile: 0.0,
+ fonts: 0.0,
+ images: 0.0,
+ render: 0.0
+ };
+ this.xref = xref;
+ this.ref = ref;
+ }
+
+ constructor.prototype = {
+ getPageProp: function pageGetPageProp(key) {
+ return this.xref.fetchIfRef(this.pageDict.get(key));
+ },
+ inheritPageProp: function pageInheritPageProp(key) {
+ var dict = this.pageDict;
+ var obj = dict.get(key);
+ while (obj === undefined) {
+ dict = this.xref.fetchIfRef(dict.get('Parent'));
+ if (!dict)
+ break;
+ obj = dict.get(key);
+ }
+ return obj;
+ },
+ get content() {
+ return shadow(this, 'content', this.getPageProp('Contents'));
+ },
+ get resources() {
+ return shadow(this, 'resources', this.inheritPageProp('Resources'));
+ },
+ get mediaBox() {
+ var obj = this.inheritPageProp('MediaBox');
+ // Reset invalid media box to letter size.
+ if (!isArray(obj) || obj.length !== 4)
+ obj = [0, 0, 612, 792];
+ return shadow(this, 'mediaBox', obj);
+ },
+ get view() {
+ var obj = this.inheritPageProp('CropBox');
+ var view = {
+ x: 0,
+ y: 0,
+ width: this.width,
+ height: this.height
+ };
+ if (isArray(obj) && obj.length == 4) {
+ var tl = this.rotatePoint(obj[0], obj[1]);
+ var br = this.rotatePoint(obj[2], obj[3]);
+ view.x = Math.min(tl.x, br.x);
+ view.y = Math.min(tl.y, br.y);
+ view.width = Math.abs(tl.x - br.x);
+ view.height = Math.abs(tl.y - br.y);
+ }
+
+ return shadow(this, 'cropBox', view);
+ },
+ get annotations() {
+ return shadow(this, 'annotations', this.inheritPageProp('Annots'));
+ },
+ get width() {
+ var mediaBox = this.mediaBox;
+ var rotate = this.rotate;
+ var width;
+ if (rotate == 0 || rotate == 180) {
+ width = (mediaBox[2] - mediaBox[0]);
+ } else {
+ width = (mediaBox[3] - mediaBox[1]);
+ }
+ return shadow(this, 'width', width);
+ },
+ get height() {
+ var mediaBox = this.mediaBox;
+ var rotate = this.rotate;
+ var height;
+ if (rotate == 0 || rotate == 180) {
+ height = (mediaBox[3] - mediaBox[1]);
+ } else {
+ height = (mediaBox[2] - mediaBox[0]);
+ }
+ return shadow(this, 'height', height);
+ },
+ get rotate() {
+ var rotate = this.inheritPageProp('Rotate') || 0;
+ // Normalize rotation so it's a multiple of 90 and between 0 and 270
+ if (rotate % 90 != 0) {
+ rotate = 0;
+ } else if (rotate >= 360) {
+ rotate = rotate % 360;
+ } else if (rotate < 0) {
+ // The spec doesn't cover negatives, assume its counterclockwise
+ // rotation. The following is the other implementation of modulo.
+ rotate = ((rotate % 360) + 360) % 360;
+ }
+ return shadow(this, 'rotate', rotate);
+ },
+
+ startRenderingFromIRQueue: function pageStartRenderingFromIRQueue(
+ IRQueue, fonts) {
+ var self = this;
+ this.IRQueue = IRQueue;
+ var gfx = new CanvasGraphics(this.ctx, this.objs);
+
+ var displayContinuation = function pageDisplayContinuation() {
+ // Always defer call to display() to work around bug in
+ // Firefox error reporting from XHR callbacks.
+ setTimeout(function pageSetTimeout() {
+ try {
+ self.display(gfx, self.callback);
+ } catch (e) {
+ if (self.callback) self.callback(e.toString());
+ throw e;
+ }
+ });
+ };
+
+ this.ensureFonts(fonts,
+ function pageStartRenderingFromIRQueueEnsureFonts() {
+ displayContinuation();
+ });
+ },
+
+ getIRQueue: function pageGetIRQueue(handler, dependency) {
+ if (this.IRQueue) {
+ // content was compiled
+ return this.IRQueue;
+ }
+
+ var xref = this.xref;
+ var content = xref.fetchIfRef(this.content);
+ var resources = xref.fetchIfRef(this.resources);
+ if (isArray(content)) {
+ // fetching items
+ var i, n = content.length;
+ for (i = 0; i < n; ++i)
+ content[i] = xref.fetchIfRef(content[i]);
+ content = new StreamsSequenceStream(content);
+ }
+
+ var pe = this.pe = new PartialEvaluator(
+ xref, handler, 'p' + this.pageNumber + '_');
+ var IRQueue = {};
+ return (this.IRQueue = pe.getIRQueue(content, resources, IRQueue,
+ dependency));
+ },
+
+ ensureFonts: function pageEnsureFonts(fonts, callback) {
+ // Convert the font names to the corresponding font obj.
+ for (var i = 0, ii = fonts.length; i < ii; i++) {
+ fonts[i] = this.objs.objs[fonts[i]].data;
+ }
+
+ // Load all the fonts
+ var fontObjs = FontLoader.bind(
+ fonts,
+ function pageEnsureFontsFontObjs(fontObjs) {
+ this.stats.fonts = Date.now();
+
+ callback.call(this);
+ }.bind(this),
+ this.objs
+ );
+ },
+
+ display: function pageDisplay(gfx, callback) {
+ var xref = this.xref;
+ var resources = xref.fetchIfRef(this.resources);
+ var mediaBox = xref.fetchIfRef(this.mediaBox);
+ assertWellFormed(isDict(resources), 'invalid page resources');
+
+ gfx.xref = xref;
+ gfx.res = resources;
+ gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1],
+ width: this.width,
+ height: this.height,
+ rotate: this.rotate });
+
+ var startIdx = 0;
+ var length = this.IRQueue.fnArray.length;
+ var IRQueue = this.IRQueue;
+
+ var self = this;
+ function next() {
+ startIdx = gfx.executeIRQueue(IRQueue, startIdx, next);
+ if (startIdx == length) {
+ self.stats.render = Date.now();
+ if (callback) callback();
+ }
+ }
+ next();
+ },
+ rotatePoint: function pageRotatePoint(x, y, reverse) {
+ var rotate = reverse ? (360 - this.rotate) : this.rotate;
+ switch (rotate) {
+ case 180:
+ return {x: this.width - x, y: y};
+ case 90:
+ return {x: this.width - y, y: this.height - x};
+ case 270:
+ return {x: y, y: x};
+ case 360:
+ case 0:
+ default:
+ return {x: x, y: this.height - y};
+ }
+ },
+ getLinks: function pageGetLinks() {
+ var xref = this.xref;
+ var annotations = xref.fetchIfRef(this.annotations) || [];
+ var i, n = annotations.length;
+ var links = [];
+ for (i = 0; i < n; ++i) {
+ var annotation = xref.fetch(annotations[i]);
+ if (!isDict(annotation))
+ continue;
+ var subtype = annotation.get('Subtype');
+ if (!isName(subtype) || subtype.name != 'Link')
+ continue;
+ var rect = annotation.get('Rect');
+ var topLeftCorner = this.rotatePoint(rect[0], rect[1]);
+ var bottomRightCorner = this.rotatePoint(rect[2], rect[3]);
+
+ var link = {};
+ link.x = Math.min(topLeftCorner.x, bottomRightCorner.x);
+ link.y = Math.min(topLeftCorner.y, bottomRightCorner.y);
+ link.width = Math.abs(topLeftCorner.x - bottomRightCorner.x);
+ link.height = Math.abs(topLeftCorner.y - bottomRightCorner.y);
+ var a = this.xref.fetchIfRef(annotation.get('A'));
+ if (a) {
+ switch (a.get('S').name) {
+ case 'URI':
+ link.url = a.get('URI');
+ break;
+ case 'GoTo':
+ link.dest = a.get('D');
+ break;
+ default:
+ TODO('other link types');
+ }
+ } else if (annotation.has('Dest')) {
+ // simple destination link
+ var dest = annotation.get('Dest');
+ link.dest = isName(dest) ? dest.name : dest;
+ }
+ links.push(link);
+ }
+ return links;
+ },
+ startRendering: function pageStartRendering(ctx, callback) {
+ this.ctx = ctx;
+ this.callback = callback;
+
+ this.startRenderingTime = Date.now();
+ this.pdf.startRendering(this);
+ }
+ };
+
+ return constructor;
+})();
+
+/**
+ * The `PDFDocModel` holds all the data of the PDF file. Compared to the
+ * `PDFDoc`, this one doesn't have any job management code.
+ * Right now there exists one PDFDocModel on the main thread + one object
+ * for each worker. If there is no worker support enabled, there are two
+ * `PDFDocModel` objects on the main thread created.
+ * TODO: Refactor the internal object structure, such that there is no
+ * need for the `PDFDocModel` anymore and there is only one object on the
+ * main thread and not one entire copy on each worker instance.
+ */
+var PDFDocModel = (function pdfDoc() {
+ function constructor(arg, callback) {
+ if (isStream(arg))
+ init.call(this, arg);
+ else if (isArrayBuffer(arg))
+ init.call(this, new Stream(arg));
+ else
+ error('PDFDocModel: Unknown argument type');
+ }
+
+ function init(stream) {
+ assertWellFormed(stream.length > 0, 'stream must have data');
+ this.stream = stream;
+ this.setup();
+ }
+
+ function find(stream, needle, limit, backwards) {
+ var pos = stream.pos;
+ var end = stream.end;
+ var str = '';
+ if (pos + limit > end)
+ limit = end - pos;
+ for (var n = 0; n < limit; ++n)
+ str += stream.getChar();
+ stream.pos = pos;
+ var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+ if (index == -1)
+ return false; /* not found */
+ stream.pos += index;
+ return true; /* found */
+ }
+
+ constructor.prototype = {
+ get linearization() {
+ var length = this.stream.length;
+ var linearization = false;
+ if (length) {
+ linearization = new Linearization(this.stream);
+ if (linearization.length != length)
+ linearization = false;
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'linearization', linearization);
+ },
+ get startXRef() {
+ var stream = this.stream;
+ var startXRef = 0;
+ var linearization = this.linearization;
+ if (linearization) {
+ // Find end of first obj.
+ stream.reset();
+ if (find(stream, 'endobj', 1024))
+ startXRef = stream.pos + 6;
+ } else {
+ // Find startxref at the end of the file.
+ var start = stream.end - 1024;
+ if (start < 0)
+ start = 0;
+ stream.pos = start;
+ if (find(stream, 'startxref', 1024, true)) {
+ stream.skip(9);
+ var ch;
+ do {
+ ch = stream.getChar();
+ } while (Lexer.isSpace(ch));
+ var str = '';
+ while ((ch - '0') <= 9) {
+ str += ch;
+ ch = stream.getChar();
+ }
+ startXRef = parseInt(str, 10);
+ if (isNaN(startXRef))
+ startXRef = 0;
+ }
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'startXRef', startXRef);
+ },
+ get mainXRefEntriesOffset() {
+ var mainXRefEntriesOffset = 0;
+ var linearization = this.linearization;
+ if (linearization)
+ mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
+ // shadow the prototype getter with a data property
+ return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
+ },
+ // Find the header, remove leading garbage and setup the stream
+ // starting from the header.
+ checkHeader: function pdfDocCheckHeader() {
+ var stream = this.stream;
+ stream.reset();
+ if (find(stream, '%PDF-', 1024)) {
+ // Found the header, trim off any garbage before it.
+ stream.moveStart();
+ return;
+ }
+ // May not be a PDF file, continue anyway.
+ },
+ setup: function pdfDocSetup(ownerPassword, userPassword) {
+ this.checkHeader();
+ this.xref = new XRef(this.stream,
+ this.startXRef,
+ this.mainXRefEntriesOffset);
+ this.catalog = new Catalog(this.xref);
+ },
+ get numPages() {
+ var linearization = this.linearization;
+ var num = linearization ? linearization.numPages : this.catalog.numPages;
+ // shadow the prototype getter
+ return shadow(this, 'numPages', num);
+ },
+ getPage: function pdfDocGetPage(n) {
+ return this.catalog.getPage(n);
+ }
+ };
+
+ return constructor;
+})();
+
+var PDFDoc = (function pdfDoc() {
+ function constructor(arg, callback) {
+ var stream = null;
+ var data = null;
+
+ if (isStream(arg)) {
+ stream = arg;
+ data = arg.bytes;
+ } else if (isArrayBuffer(arg)) {
+ stream = new Stream(arg);
+ data = arg;
+ } else {
+ error('PDFDoc: Unknown argument type');
+ }
+
+ this.data = data;
+ this.stream = stream;
+ this.pdf = new PDFDocModel(stream);
+
+ this.catalog = this.pdf.catalog;
+ this.objs = new PDFObjects();
+
+ this.pageCache = [];
+ this.fontsLoading = {};
+ this.workerReadyPromise = new Promise('workerReady');
+
+ // If worker support isn't disabled explicit and the browser has worker
+ // support, create a new web worker and test if it/the browser fullfills
+ // all requirements to run parts of pdf.js in a web worker.
+ // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+ // as it arrives on the worker. Chrome added this with version 15.
+ if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
+ var workerSrc = PDFJS.workerSrc;
+ if (typeof workerSrc === 'undefined') {
+ throw 'No PDFJS.workerSrc specified';
+ }
+
+ var worker;
+ try {
+ worker = new Worker(workerSrc);
+ } catch (e) {
+ // Some versions of FF can't create a worker on localhost, see:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+ globalScope.PDFJS.disableWorker = true;
+ this.setupFakeWorker();
+ return;
+ }
+
+ var messageHandler = new MessageHandler('main', worker);
+
+ // Tell the worker the file it was created from.
+ messageHandler.send('workerSrc', workerSrc);
+
+ messageHandler.on('test', function pdfDocTest(supportTypedArray) {
+ if (supportTypedArray) {
+ this.worker = worker;
+ this.setupMessageHandler(messageHandler);
+ } else {
+ this.setupFakeWorker();
+ }
+ }.bind(this));
+
+ var testObj = new Uint8Array(1);
+ messageHandler.send('test', testObj);
+ } else {
+ this.setupFakeWorker();
+ }
+ }
+
+ constructor.prototype = {
+ setupFakeWorker: function() {
+ // If we don't use a worker, just post/sendMessage to the main thread.
+ var fakeWorker = {
+ postMessage: function pdfDocPostMessage(obj) {
+ fakeWorker.onmessage({data: obj});
+ },
+ terminate: function pdfDocTerminate() {}
+ };
+
+ var messageHandler = new MessageHandler('main', fakeWorker);
+ this.setupMessageHandler(messageHandler);
+
+ // If the main thread is our worker, setup the handling for the messages
+ // the main thread sends to it self.
+ WorkerMessageHandler.setup(messageHandler);
+ },
+
+
+ setupMessageHandler: function(messageHandler) {
+ this.messageHandler = messageHandler;
+
+ messageHandler.on('page', function pdfDocPage(data) {
+ var pageNum = data.pageNum;
+ var page = this.pageCache[pageNum];
+ var depFonts = data.depFonts;
+
+ page.startRenderingFromIRQueue(data.IRQueue, depFonts);
+ }, this);
+
+ messageHandler.on('obj', function pdfDocObj(data) {
+ var id = data[0];
+ var type = data[1];
+
+ switch (type) {
+ case 'JpegStream':
+ var IR = data[2];
+ new JpegImageLoader(id, IR, this.objs);
+ break;
+ case 'Font':
+ var name = data[2];
+ var file = data[3];
+ var properties = data[4];
+
+ if (file) {
+ var fontFileDict = new Dict();
+ fontFileDict.map = file.dict.map;
+
+ var fontFile = new Stream(file.bytes, file.start,
+ file.end - file.start, fontFileDict);
+
+ // Check if this is a FlateStream. Otherwise just use the created
+ // Stream one. This makes complex_ttf_font.pdf work.
+ var cmf = file.bytes[0];
+ if ((cmf & 0x0f) == 0x08) {
+ file = new FlateStream(fontFile);
+ } else {
+ file = fontFile;
+ }
+ }
+
+ // For now, resolve the font object here direclty. The real font
+ // object is then created in FontLoader.bind().
+ this.objs.resolve(id, {
+ name: name,
+ file: file,
+ properties: properties
+ });
+ break;
+ default:
+ throw 'Got unkown object type ' + type;
+ }
+ }, this);
+
+ messageHandler.on('font_ready', function pdfDocFontReady(data) {
+ var id = data[0];
+ var font = new FontShape(data[1]);
+
+ // If there is no string, then there is nothing to attach to the DOM.
+ if (!font.str) {
+ this.objs.resolve(id, font);
+ } else {
+ this.objs.setData(id, font);
+ }
+ }.bind(this));
+
+ setTimeout(function pdfDocFontReadySetTimeout() {
+ messageHandler.send('doc', this.data);
+ this.workerReadyPromise.resolve(true);
+ }.bind(this));
+ },
+
+ get numPages() {
+ return this.pdf.numPages;
+ },
+
+ startRendering: function pdfDocStartRendering(page) {
+ // The worker might not be ready to receive the page request yet.
+ this.workerReadyPromise.then(function pdfDocStartRenderingThen() {
+ this.messageHandler.send('page_request', page.pageNumber + 1);
+ }.bind(this));
+ },
+
+ getPage: function pdfDocGetPage(n) {
+ if (this.pageCache[n])
+ return this.pageCache[n];
+
+ var page = this.pdf.getPage(n);
+ // Add a reference to the objects such that Page can forward the reference
+ // to the CanvasGraphics and so on.
+ page.objs = this.objs;
+ page.pdf = this;
+ return (this.pageCache[n] = page);
+ },
+
+ destroy: function pdfDocDestroy() {
+ if (this.worker)
+ this.worker.terminate();
+
+ if (this.fontWorker)
+ this.fontWorker.terminate();
+
+ for (var n in this.pageCache)
+ delete this.pageCache[n];
+
+ delete this.data;
+ delete this.stream;
+ delete this.pdf;
+ delete this.catalog;
+ }
+ };
+
+ return constructor;
+})();
+
+globalScope.PDFJS.PDFDoc = PDFDoc;
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function log(msg) {
+ if (console && console.log)
+ console.log(msg);
+ else if (print)
+ print(msg);
+}
+
+function warn(msg) {
+ if (verbosity >= WARNINGS)
+ log('Warning: ' + msg);
+}
+
+function backtrace() {
+ try {
+ throw new Error();
+ } catch (e) {
+ return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+ }
+}
+
+function error(msg) {
+ log('Error: ' + msg);
+ log(backtrace());
+ throw new Error(msg);
+}
+
+function TODO(what) {
+ if (verbosity >= TODOS)
+ log('TODO: ' + what);
+}
+
+function malformed(msg) {
+ error('Malformed PDF: ' + msg);
+}
+
+function assert(cond, msg) {
+ if (!cond)
+ error(msg);
+}
+
+// In a well-formed PDF, |cond| holds. If it doesn't, subsequent
+// behavior is undefined.
+function assertWellFormed(cond, msg) {
+ if (!cond)
+ malformed(msg);
+}
+
+function shadow(obj, prop, value) {
+ Object.defineProperty(obj, prop, { value: value,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return value;
+}
+
+function bytesToString(bytes) {
+ var str = '';
+ var length = bytes.length;
+ for (var n = 0; n < length; ++n)
+ str += String.fromCharCode(bytes[n]);
+ return str;
+}
+
+function stringToBytes(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var n = 0; n < length; ++n)
+ bytes[n] = str.charCodeAt(n) & 0xFF;
+ return bytes;
+}
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = (function utilUtil() {
+ function constructor() {}
+ constructor.makeCssRgb = function makergb(r, g, b) {
+ var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
+ return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+ };
+ constructor.makeCssCmyk = function makecmyk(c, m, y, k) {
+ c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
+ var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
+ return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+ };
+ constructor.applyTransform = function apply(p, m) {
+ var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+ var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+ return [xt, yt];
+ };
+
+ return constructor;
+})();
+
+var PDFStringTranslateTable = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+ 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+ 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+ 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+ var i, n = str.length, str2 = '';
+ if (str[0] === '\xFE' && str[1] === '\xFF') {
+ // UTF16BE BOM
+ for (i = 2; i < n; i += 2)
+ str2 += String.fromCharCode(
+ (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
+ } else {
+ for (i = 0; i < n; ++i) {
+ var code = PDFStringTranslateTable[str.charCodeAt(i)];
+ str2 += code ? String.fromCharCode(code) : str.charAt(i);
+ }
+ }
+ return str2;
+}
+
+function isBool(v) {
+ return typeof v == 'boolean';
+}
+
+function isInt(v) {
+ return typeof v == 'number' && ((v | 0) == v);
+}
+
+function isNum(v) {
+ return typeof v == 'number';
+}
+
+function isString(v) {
+ return typeof v == 'string';
+}
+
+function isNull(v) {
+ return v === null;
+}
+
+function isName(v) {
+ return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+ return v instanceof Cmd && (!cmd || v.cmd == cmd);
+}
+
+function isDict(v, type) {
+ return v instanceof Dict && (!type || v.get('Type').name == type);
+}
+
+function isArray(v) {
+ return v instanceof Array;
+}
+
+function isStream(v) {
+ return typeof v == 'object' && v != null && ('getChar' in v);
+}
+
+function isArrayBuffer(v) {
+ return typeof v == 'object' && v != null && ('byteLength' in v);
+}
+
+function isRef(v) {
+ return v instanceof Ref;
+}
+
+function isPDFFunction(v) {
+ var fnDict;
+ if (typeof v != 'object')
+ return false;
+ else if (isDict(v))
+ fnDict = v;
+ else if (isStream(v))
+ fnDict = v.dict;
+ else
+ return false;
+ return fnDict.has('FunctionType');
+}
+
+/**
+ * 'Promise' object.
+ * Each object that is stored in PDFObjects is based on a Promise object that
+ * contains the status of the object and the data. There migth be situations,
+ * where a function want to use the value of an object, but it isn't ready at
+ * that time. To get a notification, once the object is ready to be used, s.o.
+ * can add a callback using the `then` method on the promise that then calls
+ * the callback once the object gets resolved.
+ * A promise can get resolved only once and only once the data of the promise
+ * can be set. If any of these happens twice or the data is required before
+ * it was set, an exception is throw.
+ */
+var Promise = (function promise() {
+ var EMPTY_PROMISE = {};
+
+ /**
+ * If `data` is passed in this constructor, the promise is created resolved.
+ * If there isn't data, it isn't resolved at the beginning.
+ */
+ function Promise(name, data) {
+ this.name = name;
+ // If you build a promise and pass in some data it's already resolved.
+ if (data != null) {
+ this.isResolved = true;
+ this._data = data;
+ this.hasData = true;
+ } else {
+ this.isResolved = false;
+ this._data = EMPTY_PROMISE;
+ }
+ this.callbacks = [];
+ };
+
+ Promise.prototype = {
+ hasData: false,
+
+ set data(value) {
+ if (value === undefined) {
+ return;
+ }
+ if (this._data !== EMPTY_PROMISE) {
+ throw 'Promise ' + this.name +
+ ': Cannot set the data of a promise twice';
+ }
+ this._data = value;
+ this.hasData = true;
+
+ if (this.onDataCallback) {
+ this.onDataCallback(value);
+ }
+ },
+
+ get data() {
+ if (this._data === EMPTY_PROMISE) {
+ throw 'Promise ' + this.name + ': Cannot get data that isn\'t set';
+ }
+ return this._data;
+ },
+
+ onData: function promiseOnData(callback) {
+ if (this._data !== EMPTY_PROMISE) {
+ callback(this._data);
+ } else {
+ this.onDataCallback = callback;
+ }
+ },
+
+ resolve: function promiseResolve(data) {
+ if (this.isResolved) {
+ throw 'A Promise can be resolved only once ' + this.name;
+ }
+
+ this.isResolved = true;
+ this.data = data;
+ var callbacks = this.callbacks;
+
+ for (var i = 0, ii = callbacks.length; i < ii; i++) {
+ callbacks[i].call(null, data);
+ }
+ },
+
+ then: function promiseThen(callback) {
+ if (!callback) {
+ throw 'Requiring callback' + this.name;
+ }
+
+ // If the promise is already resolved, call the callback directly.
+ if (this.isResolved) {
+ var data = this.data;
+ callback.call(null, data);
+ } else {
+ this.callbacks.push(callback);
+ }
+ }
+ };
+
+ return Promise;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+// <canvas> contexts store most of the state we need natively.
+// However, PDF needs a bit more state, which we store here.
+
+var CanvasExtraState = (function canvasExtraState() {
+ function constructor(old) {
+ // Are soft masks and alpha values shapes or opacities?
+ this.alphaIsShape = false;
+ this.fontSize = 0;
+ this.textMatrix = IDENTITY_MATRIX;
+ this.leading = 0;
+ // Current point (in user coordinates)
+ this.x = 0;
+ this.y = 0;
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ // Color spaces
+ this.fillColorSpace = new DeviceGrayCS();
+ this.fillColorSpaceObj = null;
+ this.strokeColorSpace = new DeviceGrayCS();
+ this.strokeColorSpaceObj = null;
+ this.fillColorObj = null;
+ this.strokeColorObj = null;
+ // Default fore and background colors
+ this.fillColor = '#000000';
+ this.strokeColor = '#000000';
+ // Note: fill alpha applies to all non-stroking operations
+ this.fillAlpha = 1;
+ this.strokeAlpha = 1;
+
+ this.old = old;
+ }
+
+ constructor.prototype = {
+ clone: function canvasextra_clone() {
+ return Object.create(this);
+ },
+ setCurrentPoint: function canvasextra_setCurrentPoint(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ };
+ return constructor;
+})();
+
+function ScratchCanvas(width, height) {
+ var canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ return canvas;
+}
+
+var CanvasGraphics = (function canvasGraphics() {
+ // Defines the time the executeIRQueue is going to be executing
+ // before it stops and shedules a continue of execution.
+ var kExecutionTime = 50;
+
+ // Number of IR commands to execute before checking
+ // if we execute longer then `kExecutionTime`.
+ var kExecutionTimeCheck = 500;
+
+ function constructor(canvasCtx, objs) {
+ this.ctx = canvasCtx;
+ this.current = new CanvasExtraState();
+ this.stateStack = [];
+ this.pendingClip = null;
+ this.res = null;
+ this.xobjs = null;
+ this.ScratchCanvas = ScratchCanvas;
+ this.objs = objs;
+ }
+
+ var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+ var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+ var NORMAL_CLIP = {};
+ var EO_CLIP = {};
+
+ constructor.prototype = {
+ beginDrawing: function canvasGraphicsBeginDrawing(mediaBox) {
+ var cw = this.ctx.canvas.width, ch = this.ctx.canvas.height;
+ this.ctx.save();
+ switch (mediaBox.rotate) {
+ case 0:
+ this.ctx.transform(1, 0, 0, -1, 0, ch);
+ break;
+ case 90:
+ this.ctx.transform(0, 1, 1, 0, 0, 0);
+ break;
+ case 180:
+ this.ctx.transform(-1, 0, 0, 1, cw, 0);
+ break;
+ case 270:
+ this.ctx.transform(0, -1, -1, 0, cw, ch);
+ break;
+ }
+ this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height);
+ },
+
+ executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR,
+ executionStartIdx, continueCallback) {
+ var argsArray = codeIR.argsArray;
+ var fnArray = codeIR.fnArray;
+ var i = executionStartIdx || 0;
+ var argsArrayLen = argsArray.length;
+
+ var executionEndIdx;
+ var startTime = Date.now();
+
+ var objs = this.objs;
+
+ do {
+ executionEndIdx = Math.min(argsArrayLen, i + kExecutionTimeCheck);
+
+ for (i; i < executionEndIdx; i++) {
+ if (fnArray[i] !== 'dependency') {
+ this[fnArray[i]].apply(this, argsArray[i]);
+ } else {
+ var deps = argsArray[i];
+ for (var n = 0, nn = deps.length; n < nn; n++) {
+ var depObjId = deps[n];
+
+ // If the promise isn't resolved yet, add the continueCallback
+ // to the promise and bail out.
+ if (!objs.isResolved(depObjId)) {
+ objs.get(depObjId, continueCallback);
+ return i;
+ }
+ }
+ }
+ }
+
+ // If the entire IRQueue was executed, stop as were done.
+ if (i == argsArrayLen) {
+ return i;
+ }
+
+ // If the execution took longer then a certain amount of time, shedule
+ // to continue exeution after a short delay.
+ // However, this is only possible if a 'continueCallback' is passed in.
+ if (continueCallback && (Date.now() - startTime) > kExecutionTime) {
+ setTimeout(continueCallback, 0);
+ return i;
+ }
+
+ // If the IRQueue isn't executed completly yet OR the execution time
+ // was short enough, do another execution round.
+ } while (true);
+ },
+
+ endDrawing: function canvasGraphicsEndDrawing() {
+ this.ctx.restore();
+ },
+
+ // Graphics state
+ setLineWidth: function canvasGraphicsSetLineWidth(width) {
+ this.ctx.lineWidth = width;
+ },
+ setLineCap: function canvasGraphicsSetLineCap(style) {
+ this.ctx.lineCap = LINE_CAP_STYLES[style];
+ },
+ setLineJoin: function canvasGraphicsSetLineJoin(style) {
+ this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+ },
+ setMiterLimit: function canvasGraphicsSetMiterLimit(limit) {
+ this.ctx.miterLimit = limit;
+ },
+ setDash: function canvasGraphicsSetDash(dashArray, dashPhase) {
+ this.ctx.mozDash = dashArray;
+ this.ctx.mozDashOffset = dashPhase;
+ },
+ setRenderingIntent: function canvasGraphicsSetRenderingIntent(intent) {
+ TODO('set rendering intent: ' + intent);
+ },
+ setFlatness: function canvasGraphicsSetFlatness(flatness) {
+ TODO('set flatness: ' + flatness);
+ },
+ setGState: function canvasGraphicsSetGState(states) {
+ for (var i = 0, ii = states.length; i < ii; i++) {
+ var state = states[i];
+ var key = state[0];
+ var value = state[1];
+
+ switch (key) {
+ case 'LW':
+ this.setLineWidth(value);
+ break;
+ case 'LC':
+ this.setLineCap(value);
+ break;
+ case 'LJ':
+ this.setLineJoin(value);
+ break;
+ case 'ML':
+ this.setMiterLimit(value);
+ break;
+ case 'D':
+ this.setDash(value[0], value[1]);
+ break;
+ case 'RI':
+ this.setRenderingIntent(value);
+ break;
+ case 'FL':
+ this.setFlatness(value);
+ break;
+ case 'Font':
+ this.setFont(state[1], state[2]);
+ break;
+ case 'CA':
+ this.current.strokeAlpha = state[1];
+ break;
+ case 'ca':
+ this.current.fillAlpha = state[1];
+ this.ctx.globalAlpha = state[1];
+ break;
+ }
+ }
+ },
+ save: function canvasGraphicsSave() {
+ this.ctx.save();
+ var old = this.current;
+ this.stateStack.push(old);
+ this.current = old.clone();
+ },
+ restore: function canvasGraphicsRestore() {
+ var prev = this.stateStack.pop();
+ if (prev) {
+ this.current = prev;
+ this.ctx.restore();
+ }
+ },
+ transform: function canvasGraphicsTransform(a, b, c, d, e, f) {
+ this.ctx.transform(a, b, c, d, e, f);
+ },
+
+ // Path
+ moveTo: function canvasGraphicsMoveTo(x, y) {
+ this.ctx.moveTo(x, y);
+ this.current.setCurrentPoint(x, y);
+ },
+ lineTo: function canvasGraphicsLineTo(x, y) {
+ this.ctx.lineTo(x, y);
+ this.current.setCurrentPoint(x, y);
+ },
+ curveTo: function canvasGraphicsCurveTo(x1, y1, x2, y2, x3, y3) {
+ this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
+ this.current.setCurrentPoint(x3, y3);
+ },
+ curveTo2: function canvasGraphicsCurveTo2(x2, y2, x3, y3) {
+ var current = this.current;
+ this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
+ current.setCurrentPoint(x3, y3);
+ },
+ curveTo3: function canvasGraphicsCurveTo3(x1, y1, x3, y3) {
+ this.curveTo(x1, y1, x3, y3, x3, y3);
+ this.current.setCurrentPoint(x3, y3);
+ },
+ closePath: function canvasGraphicsClosePath() {
+ this.ctx.closePath();
+ },
+ rectangle: function canvasGraphicsRectangle(x, y, width, height) {
+ this.ctx.rect(x, y, width, height);
+ },
+ stroke: function canvasGraphicsStroke(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var strokeColor = this.current.strokeColor;
+ // For stroke we want to temporarily change the global alpha to the
+ // stroking alpha.
+ ctx.globalAlpha = this.current.strokeAlpha;
+ if (strokeColor && strokeColor.hasOwnProperty('type') &&
+ strokeColor.type === 'Pattern') {
+ // for patterns, we transform to pattern space, calculate
+ // the pattern, call stroke, and restore to user space
+ ctx.save();
+ ctx.strokeStyle = strokeColor.getPattern(ctx);
+ ctx.stroke();
+ ctx.restore();
+ } else {
+ ctx.stroke();
+ }
+ if (consumePath)
+ this.consumePath();
+ // Restore the global alpha to the fill alpha
+ ctx.globalAlpha = this.current.fillAlpha;
+ },
+ closeStroke: function canvasGraphicsCloseStroke() {
+ this.closePath();
+ this.stroke();
+ },
+ fill: function canvasGraphicsFill(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var fillColor = this.current.fillColor;
+
+ if (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') {
+ ctx.save();
+ ctx.fillStyle = fillColor.getPattern(ctx);
+ ctx.fill();
+ ctx.restore();
+ } else {
+ ctx.fill();
+ }
+ if (consumePath)
+ this.consumePath();
+ },
+ eoFill: function canvasGraphicsEoFill() {
+ var savedFillRule = this.setEOFillRule();
+ this.fill();
+ this.restoreFillRule(savedFillRule);
+ },
+ fillStroke: function canvasGraphicsFillStroke() {
+ this.fill(false);
+ this.stroke(false);
+
+ this.consumePath();
+ },
+ eoFillStroke: function canvasGraphicsEoFillStroke() {
+ var savedFillRule = this.setEOFillRule();
+ this.fillStroke();
+ this.restoreFillRule(savedFillRule);
+ },
+ closeFillStroke: function canvasGraphicsCloseFillStroke() {
+ this.closePath();
+ this.fillStroke();
+ },
+ closeEOFillStroke: function canvasGraphicsCloseEOFillStroke() {
+ var savedFillRule = this.setEOFillRule();
+ this.closePath();
+ this.fillStroke();
+ this.restoreFillRule(savedFillRule);
+ },
+ endPath: function canvasGraphicsEndPath() {
+ this.consumePath();
+ },
+
+ // Clipping
+ clip: function canvasGraphicsClip() {
+ this.pendingClip = NORMAL_CLIP;
+ },
+ eoClip: function canvasGraphicsEoClip() {
+ this.pendingClip = EO_CLIP;
+ },
+
+ // Text
+ beginText: function canvasGraphicsBeginText() {
+ this.current.textMatrix = IDENTITY_MATRIX;
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ endText: function canvasGraphicsEndText() {
+ },
+ setCharSpacing: function canvasGraphicsSetCharSpacing(spacing) {
+ this.current.charSpacing = spacing;
+ },
+ setWordSpacing: function canvasGraphicsSetWordSpacing(spacing) {
+ this.current.wordSpacing = spacing;
+ },
+ setHScale: function canvasGraphicsSetHScale(scale) {
+ this.current.textHScale = scale / 100;
+ },
+ setLeading: function canvasGraphicsSetLeading(leading) {
+ this.current.leading = -leading;
+ },
+ setFont: function canvasGraphicsSetFont(fontRefName, size) {
+ var fontObj = this.objs.get(fontRefName).fontObj;
+
+ if (!fontObj) {
+ throw 'Can\'t find font for ' + fontRefName;
+ }
+
+ var name = fontObj.loadedName || 'sans-serif';
+
+ this.current.font = fontObj;
+ this.current.fontSize = size;
+
+ var name = fontObj.loadedName || 'sans-serif';
+ var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+ (fontObj.bold ? 'bold' : 'normal');
+
+ var italic = fontObj.italic ? 'italic' : 'normal';
+ var serif = fontObj.serif ? 'serif' : 'sans-serif';
+ var typeface = '"' + name + '", ' + serif;
+ var rule = italic + ' ' + bold + ' ' + size + 'px ' + typeface;
+ this.ctx.font = rule;
+ },
+ setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) {
+ TODO('text rendering mode: ' + mode);
+ },
+ setTextRise: function canvasGraphicsSetTextRise(rise) {
+ TODO('text rise: ' + rise);
+ },
+ moveText: function canvasGraphicsMoveText(x, y) {
+ this.current.x = this.current.lineX += x;
+ this.current.y = this.current.lineY += y;
+ },
+ setLeadingMoveText: function canvasGraphicsSetLeadingMoveText(x, y) {
+ this.setLeading(-y);
+ this.moveText(x, y);
+ },
+ setTextMatrix: function canvasGraphicsSetTextMatrix(a, b, c, d, e, f) {
+ this.current.textMatrix = [a, b, c, d, e, f];
+
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ nextLine: function canvasGraphicsNextLine() {
+ this.moveText(0, this.current.leading);
+ },
+ showText: function canvasGraphicsShowText(text) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var font = current.font;
+ var glyphs = font.charsToGlyphs(text);
+ var fontSize = current.fontSize;
+ var charSpacing = current.charSpacing;
+ var wordSpacing = current.wordSpacing;
+ var textHScale = current.textHScale;
+ var glyphsLength = glyphs.length;
+ if (font.coded) {
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.translate(current.x, current.y);
+
+ var fontMatrix = font.fontMatrix || IDENTITY_MATRIX;
+ ctx.scale(1 / textHScale, 1);
+ for (var i = 0; i < glyphsLength; ++i) {
+
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ this.ctx.translate(wordSpacing, 0);
+ continue;
+ }
+
+ this.save();
+ ctx.scale(fontSize, fontSize);
+ ctx.transform.apply(ctx, fontMatrix);
+ this.executeIRQueue(glyph.codeIRQueue);
+ this.restore();
+
+ var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
+ var width = transformed[0] * fontSize + charSpacing;
+
+ ctx.translate(width, 0);
+ current.x += width;
+
+ }
+ ctx.restore();
+ } else {
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.scale(1, -1);
+ ctx.translate(current.x, -1 * current.y);
+ ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX);
+
+ ctx.scale(1 / textHScale, 1);
+
+ var width = 0;
+ for (var i = 0; i < glyphsLength; ++i) {
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ width += wordSpacing;
+ continue;
+ }
+
+ var unicode = glyph.unicode;
+ var char = (unicode >= 0x10000) ?
+ String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10),
+ 0xDC00 | (unicode & 0x3FF)) : String.fromCharCode(unicode);
+
+ ctx.fillText(char, width, 0);
+ width += glyph.width * fontSize * 0.001 + charSpacing;
+ }
+ current.x += width;
+
+ ctx.restore();
+ }
+ },
+
+ showSpacedText: function canvasGraphicsShowSpacedText(arr) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var fontSize = current.fontSize;
+ var textHScale = current.textHScale;
+ var arrLength = arr.length;
+ for (var i = 0; i < arrLength; ++i) {
+ var e = arr[i];
+ if (isNum(e)) {
+ current.x -= e * 0.001 * fontSize * textHScale;
+ } else if (isString(e)) {
+ this.showText(e);
+ } else {
+ malformed('TJ array element ' + e + ' is not string or num');
+ }
+ }
+ },
+ nextLineShowText: function canvasGraphicsNextLineShowText(text) {
+ this.nextLine();
+ this.showText(text);
+ },
+ nextLineSetSpacingShowText:
+ function canvasGraphicsNextLineSetSpacingShowText(wordSpacing,
+ charSpacing,
+ text) {
+ this.setWordSpacing(wordSpacing);
+ this.setCharSpacing(charSpacing);
+ this.nextLineShowText(text);
+ },
+
+ // Type3 fonts
+ setCharWidth: function canvasGraphicsSetCharWidth(xWidth, yWidth) {
+ // We can safely ignore this since the width should be the same
+ // as the width in the Widths array.
+ },
+ setCharWidthAndBounds: function canvasGraphicsSetCharWidthAndBounds(xWidth,
+ yWidth,
+ llx,
+ lly,
+ urx,
+ ury) {
+ // TODO According to the spec we're also suppose to ignore any operators
+ // that set color or include images while processing this type3 font.
+ this.rectangle(llx, lly, urx - llx, ury - lly);
+ this.clip();
+ this.endPath();
+ },
+
+ // Color
+ setStrokeColorSpace: function canvasGraphicsSetStrokeColorSpace(raw) {
+ this.current.strokeColorSpace = ColorSpace.fromIR(raw);
+ },
+ setFillColorSpace: function canvasGraphicsSetFillColorSpace(raw) {
+ this.current.fillColorSpace = ColorSpace.fromIR(raw);
+ },
+ setStrokeColor: function canvasGraphicsSetStrokeColor(/*...*/) {
+ var cs = this.current.strokeColorSpace;
+ var color = cs.getRgb(arguments);
+ var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ getColorN_IR_Pattern: function canvasGraphicsGetColorN_IR_Pattern(IR, cs) {
+ if (IR[0] == 'TilingPattern') {
+ var args = IR[1];
+ var base = cs.base;
+ var color;
+ if (base) {
+ var baseComps = base.numComps;
+
+ color = [];
+ for (var i = 0; i < baseComps; ++i)
+ color.push(args[i]);
+
+ color = base.getRgb(color);
+ }
+ var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
+ } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
+ var pattern = Pattern.shadingFromIR(this.ctx, IR);
+ } else {
+ throw 'Unkown IR type';
+ }
+ return pattern;
+ },
+ setStrokeColorN_IR: function canvasGraphicsSetStrokeColorN(/*...*/) {
+ var cs = this.current.strokeColorSpace;
+
+ if (cs.name == 'Pattern') {
+ this.current.strokeColor = this.getColorN_IR_Pattern(arguments, cs);
+ } else {
+ this.setStrokeColor.apply(this, arguments);
+ }
+ },
+ setFillColor: function canvasGraphicsSetFillColor(/*...*/) {
+ var cs = this.current.fillColorSpace;
+ var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setFillColorN_IR: function canvasGraphicsSetFillColorN(/*...*/) {
+ var cs = this.current.fillColorSpace;
+
+ if (cs.name == 'Pattern') {
+ this.current.fillColor = this.getColorN_IR_Pattern(arguments, cs);
+ } else {
+ this.setFillColor.apply(this, arguments);
+ }
+ },
+ setStrokeGray: function canvasGraphicsSetStrokeGray(gray) {
+ if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
+ this.current.strokeColorSpace = new DeviceGrayCS();
+
+ var color = Util.makeCssRgb(gray, gray, gray);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillGray: function canvasGraphicsSetFillGray(gray) {
+ if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
+ this.current.fillColorSpace = new DeviceGrayCS();
+
+ var color = Util.makeCssRgb(gray, gray, gray);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setStrokeRGBColor: function canvasGraphicsSetStrokeRGBColor(r, g, b) {
+ if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
+ this.current.strokeColorSpace = new DeviceRgbCS();
+
+ var color = Util.makeCssRgb(r, g, b);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillRGBColor: function canvasGraphicsSetFillRGBColor(r, g, b) {
+ if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
+ this.current.fillColorSpace = new DeviceRgbCS();
+
+ var color = Util.makeCssRgb(r, g, b);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setStrokeCMYKColor: function canvasGraphicsSetStrokeCMYKColor(c, m, y, k) {
+ if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
+ this.current.strokeColorSpace = new DeviceCmykCS();
+
+ var color = Util.makeCssCmyk(c, m, y, k);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillCMYKColor: function canvasGraphicsSetFillCMYKColor(c, m, y, k) {
+ if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
+ this.current.fillColorSpace = new DeviceCmykCS();
+
+ var color = Util.makeCssCmyk(c, m, y, k);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+
+ shadingFill: function canvasGraphicsShadingFill(patternIR) {
+ var ctx = this.ctx;
+
+ this.save();
+ ctx.fillStyle = Pattern.shadingFromIR(ctx, patternIR);
+
+ var inv = ctx.mozCurrentTransformInverse;
+ if (inv) {
+ var canvas = ctx.canvas;
+ var width = canvas.width;
+ var height = canvas.height;
+
+ var bl = Util.applyTransform([0, 0], inv);
+ var br = Util.applyTransform([0, width], inv);
+ var ul = Util.applyTransform([height, 0], inv);
+ var ur = Util.applyTransform([height, width], inv);
+
+ var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+ var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+ var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+ var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+
+ this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+ } else {
+ // HACK to draw the gradient onto an infinite rectangle.
+ // PDF gradients are drawn across the entire image while
+ // Canvas only allows gradients to be drawn in a rectangle
+ // The following bug should allow us to remove this.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
+
+ this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+ }
+
+ this.restore();
+ },
+
+ // Images
+ beginInlineImage: function canvasGraphicsBeginInlineImage() {
+ error('Should not call beginInlineImage');
+ },
+ beginImageData: function canvasGraphicsBeginImageData() {
+ error('Should not call beginImageData');
+ },
+
+ paintFormXObjectBegin: function canvasGraphicsPaintFormXObjectBegin(matrix,
+ bbox) {
+ this.save();
+
+ if (matrix && isArray(matrix) && 6 == matrix.length)
+ this.transform.apply(this, matrix);
+
+ if (bbox && isArray(bbox) && 4 == bbox.length) {
+ var width = bbox[2] - bbox[0];
+ var height = bbox[3] - bbox[1];
+ this.rectangle(bbox[0], bbox[1], width, height);
+ this.clip();
+ this.endPath();
+ }
+ },
+
+ paintFormXObjectEnd: function canvasGraphicsPaintFormXObjectEnd() {
+ this.restore();
+ },
+
+ paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
+ var image = this.objs.get(objId);
+ if (!image) {
+ error('Dependent image isn\'t ready yet');
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var domImage = image.getImage();
+ ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, -h, w, h);
+
+ this.restore();
+ },
+
+ paintImageMaskXObject: function canvasGraphicsPaintImageMaskXObject(
+ imgArray, inverseDecode, width, height) {
+ function applyStencilMask(buffer, inverseDecode) {
+ var imgArrayPos = 0;
+ var i, j, mask, buf;
+ // removing making non-masked pixels transparent
+ var bufferPos = 3; // alpha component offset
+ for (i = 0; i < height; i++) {
+ mask = 0;
+ for (j = 0; j < width; j++) {
+ if (!mask) {
+ buf = imgArray[imgArrayPos++];
+ mask = 128;
+ }
+ if (!(buf & mask) == inverseDecode) {
+ buffer[bufferPos] = 0;
+ }
+ bufferPos += 4;
+ mask >>= 1;
+ }
+ }
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ var w = width, h = height;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var tmpCanvas = new this.ScratchCanvas(w, h);
+ var tmpCtx = tmpCanvas.getContext('2d');
+
+ var fillColor = this.current.fillColor;
+ tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') ?
+ fillColor.getPattern(tmpCtx) : fillColor;
+ tmpCtx.fillRect(0, 0, w, h);
+
+ var imgData = tmpCtx.getImageData(0, 0, w, h);
+ var pixels = imgData.data;
+
+ applyStencilMask(pixels, inverseDecode);
+
+ tmpCtx.putImageData(imgData, 0, 0);
+ ctx.drawImage(tmpCanvas, 0, -h);
+ this.restore();
+ },
+
+ paintImageXObject: function canvasGraphicsPaintImageXObject(imgData) {
+ this.save();
+ var ctx = this.ctx;
+ var w = imgData.width;
+ var h = imgData.height;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var tmpCanvas = new this.ScratchCanvas(w, h);
+ var tmpCtx = tmpCanvas.getContext('2d');
+ var tmpImgData;
+
+ // Some browsers can set an UInt8Array directly as imageData, some
+ // can't. As long as we don't have proper feature detection, just
+ // copy over each pixel and set the imageData that way.
+ tmpImgData = tmpCtx.getImageData(0, 0, w, h);
+
+ // Copy over the imageData.
+ var tmpImgDataPixels = tmpImgData.data;
+ var len = tmpImgDataPixels.length;
+
+ while (len--) {
+ tmpImgDataPixels[len] = imgData.data[len];
+ }
+
+ tmpCtx.putImageData(tmpImgData, 0, 0);
+ ctx.drawImage(tmpCanvas, 0, -h);
+ this.restore();
+ },
+
+ // Marked content
+
+ markPoint: function canvasGraphicsMarkPoint(tag) {
+ TODO('Marked content');
+ },
+ markPointProps: function canvasGraphicsMarkPointProps(tag, properties) {
+ TODO('Marked content');
+ },
+ beginMarkedContent: function canvasGraphicsBeginMarkedContent(tag) {
+ TODO('Marked content');
+ },
+ beginMarkedContentProps:
+ function canvasGraphicsBeginMarkedContentProps(tag, properties) {
+ TODO('Marked content');
+ },
+ endMarkedContent: function canvasGraphicsEndMarkedContent() {
+ TODO('Marked content');
+ },
+
+ // Compatibility
+
+ beginCompat: function canvasGraphicsBeginCompat() {
+ TODO('ignore undefined operators (should we do that anyway?)');
+ },
+ endCompat: function canvasGraphicsEndCompat() {
+ TODO('stop ignoring undefined operators');
+ },
+
+ // Helper functions
+
+ consumePath: function canvasGraphicsConsumePath() {
+ if (this.pendingClip) {
+ var savedFillRule = null;
+ if (this.pendingClip == EO_CLIP)
+ savedFillRule = this.setEOFillRule();
+
+ this.ctx.clip();
+
+ this.pendingClip = null;
+ if (savedFillRule !== null)
+ this.restoreFillRule(savedFillRule);
+ }
+ this.ctx.beginPath();
+ },
+ // We generally keep the canvas context set for
+ // nonzero-winding, and just set evenodd for the operations
+ // that need them.
+ setEOFillRule: function canvasGraphicsSetEOFillRule() {
+ var savedFillRule = this.ctx.mozFillRule;
+ this.ctx.mozFillRule = 'evenodd';
+ return savedFillRule;
+ },
+ restoreFillRule: function canvasGraphicsRestoreFillRule(rule) {
+ this.ctx.mozFillRule = rule;
+ }
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Name = (function nameName() {
+ function constructor(name) {
+ this.name = name;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+var Cmd = (function cmdCmd() {
+ function constructor(cmd) {
+ this.cmd = cmd;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+var Dict = (function dictDict() {
+ function constructor() {
+ this.map = Object.create(null);
+ }
+
+ constructor.prototype = {
+ get: function dictGet(key1, key2, key3) {
+ var value;
+ if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
+ typeof key2 == 'undefined') {
+ return value;
+ }
+ if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map ||
+ typeof key3 == 'undefined') {
+ return value;
+ }
+
+ return this.map[key3] || null;
+ },
+
+ set: function dictSet(key, value) {
+ this.map[key] = value;
+ },
+
+ has: function dictHas(key) {
+ return key in this.map;
+ },
+
+ forEach: function dictForEach(callback) {
+ for (var key in this.map) {
+ callback(key, this.map[key]);
+ }
+ }
+ };
+
+ return constructor;
+})();
+
+var Ref = (function refRef() {
+ function constructor(num, gen) {
+ this.num = num;
+ this.gen = gen;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+// The reference is identified by number and generation,
+// this structure stores only one instance of the reference.
+var RefSet = (function refSet() {
+ function constructor() {
+ this.dict = {};
+ }
+
+ constructor.prototype = {
+ has: function refSetHas(ref) {
+ return !!this.dict['R' + ref.num + '.' + ref.gen];
+ },
+
+ put: function refSetPut(ref) {
+ this.dict['R' + ref.num + '.' + ref.gen] = ref;
+ }
+ };
+
+ return constructor;
+})();
+
+var Catalog = (function catalogCatalog() {
+ function constructor(xref) {
+ this.xref = xref;
+ var obj = xref.getCatalogObj();
+ assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
+ this.catDict = obj;
+ }
+
+ constructor.prototype = {
+ get toplevelPagesDict() {
+ var pagesObj = this.catDict.get('Pages');
+ assertWellFormed(isRef(pagesObj), 'invalid top-level pages reference');
+ var xrefObj = this.xref.fetch(pagesObj);
+ assertWellFormed(isDict(xrefObj), 'invalid top-level pages dictionary');
+ // shadow the prototype getter
+ return shadow(this, 'toplevelPagesDict', xrefObj);
+ },
+ get documentOutline() {
+ var obj = this.catDict.get('Outlines');
+ var xref = this.xref;
+ var root = { items: [] };
+ if (isRef(obj)) {
+ obj = xref.fetch(obj).get('First');
+ var processed = new RefSet();
+ if (isRef(obj)) {
+ var queue = [{obj: obj, parent: root}];
+ // to avoid recursion keeping track of the items
+ // in the processed dictionary
+ processed.put(obj);
+ while (queue.length > 0) {
+ var i = queue.shift();
+ var outlineDict = xref.fetch(i.obj);
+ if (!outlineDict.has('Title'))
+ error('Invalid outline item');
+ var dest = outlineDict.get('A');
+ if (dest)
+ dest = xref.fetchIfRef(dest).get('D');
+ else if (outlineDict.has('Dest')) {
+ dest = outlineDict.get('Dest');
+ if (isName(dest))
+ dest = dest.name;
+ }
+ var title = xref.fetchIfRef(outlineDict.get('Title'));
+ var outlineItem = {
+ dest: dest,
+ title: stringToPDFString(title),
+ color: outlineDict.get('C') || [0, 0, 0],
+ count: outlineDict.get('Count'),
+ bold: !!(outlineDict.get('F') & 2),
+ italic: !!(outlineDict.get('F') & 1),
+ items: []
+ };
+ i.parent.items.push(outlineItem);
+ obj = outlineDict.get('First');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: outlineItem});
+ processed.put(obj);
+ }
+ obj = outlineDict.get('Next');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: i.parent});
+ processed.put(obj);
+ }
+ }
+ }
+ }
+ obj = root.items.length > 0 ? root.items : null;
+ return shadow(this, 'documentOutline', obj);
+ },
+ get numPages() {
+ var obj = this.toplevelPagesDict.get('Count');
+ assertWellFormed(
+ isInt(obj),
+ 'page count in top level pages object is not an integer'
+ );
+ // shadow the prototype getter
+ return shadow(this, 'num', obj);
+ },
+ traverseKids: function catalogTraverseKids(pagesDict) {
+ var pageCache = this.pageCache;
+ var kids = pagesDict.get('Kids');
+ assertWellFormed(isArray(kids),
+ 'page dictionary kids object is not an array');
+ for (var i = 0, ii = kids.length; i < ii; ++i) {
+ var kid = kids[i];
+ assertWellFormed(isRef(kid),
+ 'page dictionary kid is not a reference');
+ var obj = this.xref.fetch(kid);
+ if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
+ pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
+ } else { // must be a child page dictionary
+ assertWellFormed(
+ isDict(obj),
+ 'page dictionary kid reference points to wrong type of object'
+ );
+ this.traverseKids(obj);
+ }
+ }
+ },
+ get destinations() {
+ function fetchDestination(xref, ref) {
+ var dest = xref.fetchIfRef(ref);
+ return isDict(dest) ? dest.get('D') : dest;
+ }
+
+ var xref = this.xref;
+ var dests = {}, nameTreeRef, nameDictionaryRef;
+ var obj = this.catDict.get('Names');
+ if (obj)
+ nameTreeRef = xref.fetchIfRef(obj).get('Dests');
+ else if (this.catDict.has('Dests'))
+ nameDictionaryRef = this.catDict.get('Dests');
+
+ if (nameDictionaryRef) {
+ // reading simple destination dictionary
+ obj = xref.fetchIfRef(nameDictionaryRef);
+ obj.forEach(function catalogForEach(key, value) {
+ if (!value) return;
+ dests[key] = fetchDestination(xref, value);
+ });
+ }
+ if (nameTreeRef) {
+ // reading name tree
+ var processed = new RefSet();
+ processed.put(nameTreeRef);
+ var queue = [nameTreeRef];
+ while (queue.length > 0) {
+ var i, n;
+ obj = xref.fetch(queue.shift());
+ if (obj.has('Kids')) {
+ var kids = obj.get('Kids');
+ for (i = 0, n = kids.length; i < n; i++) {
+ var kid = kids[i];
+ if (processed.has(kid))
+ error('invalid destinations');
+ queue.push(kid);
+ processed.put(kid);
+ }
+ continue;
+ }
+ var names = obj.get('Names');
+ for (i = 0, n = names.length; i < n; i += 2) {
+ dests[names[i]] = fetchDestination(xref, names[i + 1]);
+ }
+ }
+ }
+ return shadow(this, 'destinations', dests);
+ },
+ getPage: function catalogGetPage(n) {
+ var pageCache = this.pageCache;
+ if (!pageCache) {
+ pageCache = this.pageCache = [];
+ this.traverseKids(this.toplevelPagesDict);
+ }
+ return this.pageCache[n - 1];
+ }
+ };
+
+ return constructor;
+})();
+
+var XRef = (function xRefXRef() {
+ function constructor(stream, startXRef, mainXRefEntriesOffset) {
+ this.stream = stream;
+ this.entries = [];
+ this.xrefstms = {};
+ var trailerDict = this.readXRef(startXRef);
+
+ // prepare the XRef cache
+ this.cache = [];
+
+ var encrypt = trailerDict.get('Encrypt');
+ if (encrypt) {
+ var fileId = trailerDict.get('ID');
+ this.encrypt = new CipherTransformFactory(this.fetch(encrypt),
+ fileId[0] /*, password */);
+ }
+
+ // get the root dictionary (catalog) object
+ if (!isRef(this.root = trailerDict.get('Root')))
+ error('Invalid root reference');
+ }
+
+ constructor.prototype = {
+ readXRefTable: function readXRefTable(parser) {
+ var obj;
+ while (true) {
+ if (isCmd(obj = parser.getObj(), 'trailer'))
+ break;
+ if (!isInt(obj))
+ error('Invalid XRef table');
+ var first = obj;
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table');
+ var n = obj;
+ if (first < 0 || n < 0 || (first + n) != ((first + n) | 0))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ for (var i = first; i < first + n; ++i) {
+ var entry = {};
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ entry.offset = obj;
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ entry.gen = obj;
+ obj = parser.getObj();
+ if (isCmd(obj, 'n')) {
+ entry.uncompressed = true;
+ } else if (isCmd(obj, 'f')) {
+ entry.free = true;
+ } else {
+ error('Invalid XRef table: ' + first + ', ' + n);
+ }
+ if (!this.entries[i]) {
+ // In some buggy PDF files the xref table claims to start at 1
+ // instead of 0.
+ if (i == 1 && first == 1 &&
+ entry.offset == 0 && entry.gen == 65535 && entry.free) {
+ i = first = 0;
+ }
+ this.entries[i] = entry;
+ }
+ }
+ }
+
+ // read the trailer dictionary
+ var dict;
+ if (!isDict(dict = parser.getObj()))
+ error('Invalid XRef table');
+
+ // get the 'Prev' pointer
+ var prev;
+ obj = dict.get('Prev');
+ if (isInt(obj)) {
+ prev = obj;
+ } else if (isRef(obj)) {
+ // certain buggy PDF generators generate "/Prev NNN 0 R" instead
+ // of "/Prev NNN"
+ prev = obj.num;
+ }
+ if (prev) {
+ this.readXRef(prev);
+ }
+
+ // check for 'XRefStm' key
+ if (isInt(obj = dict.get('XRefStm'))) {
+ var pos = obj;
+ // ignore previously loaded xref streams (possible infinite recursion)
+ if (!(pos in this.xrefstms)) {
+ this.xrefstms[pos] = 1;
+ this.readXRef(pos);
+ }
+ }
+
+ return dict;
+ },
+ readXRefStream: function readXRefStream(stream) {
+ var streamParameters = stream.parameters;
+ var byteWidths = streamParameters.get('W');
+ var range = streamParameters.get('Index');
+ if (!range)
+ range = [0, streamParameters.get('Size')];
+ var i, j;
+ while (range.length > 0) {
+ var first = range[0], n = range[1];
+ if (!isInt(first) || !isInt(n))
+ error('Invalid XRef range fields: ' + first + ', ' + n);
+ var typeFieldWidth = byteWidths[0];
+ var offsetFieldWidth = byteWidths[1];
+ var generationFieldWidth = byteWidths[2];
+ if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
+ !isInt(generationFieldWidth)) {
+ error('Invalid XRef entry fields length: ' + first + ', ' + n);
+ }
+ for (i = 0; i < n; ++i) {
+ var type = 0, offset = 0, generation = 0;
+ for (j = 0; j < typeFieldWidth; ++j)
+ type = (type << 8) | stream.getByte();
+ // if type field is absent, its default value = 1
+ if (typeFieldWidth == 0)
+ type = 1;
+ for (j = 0; j < offsetFieldWidth; ++j)
+ offset = (offset << 8) | stream.getByte();
+ for (j = 0; j < generationFieldWidth; ++j)
+ generation = (generation << 8) | stream.getByte();
+ var entry = {};
+ entry.offset = offset;
+ entry.gen = generation;
+ switch (type) {
+ case 0:
+ entry.free = true;
+ break;
+ case 1:
+ entry.uncompressed = true;
+ break;
+ case 2:
+ break;
+ default:
+ error('Invalid XRef entry type: ' + type);
+ }
+ if (!this.entries[first + i])
+ this.entries[first + i] = entry;
+ }
+ range.splice(0, 2);
+ }
+ var prev = streamParameters.get('Prev');
+ if (isInt(prev))
+ this.readXRef(prev);
+ return streamParameters;
+ },
+ indexObjects: function indexObjects() {
+ // Simple scan through the PDF content to find objects,
+ // trailers and XRef streams.
+ function readToken(data, offset) {
+ var token = '', ch = data[offset];
+ while (ch !== 13 && ch !== 10) {
+ if (++offset >= data.length)
+ break;
+ token += String.fromCharCode(ch);
+ ch = data[offset];
+ }
+ return token;
+ }
+ function skipUntil(data, offset, what) {
+ var length = what.length, dataLength = data.length;
+ var skipped = 0;
+ // finding byte sequence
+ while (offset < dataLength) {
+ var i = 0;
+ while (i < length && data[offset + i] == what[i])
+ ++i;
+ if (i >= length)
+ break; // sequence found
+
+ offset++;
+ skipped++;
+ }
+ return skipped;
+ }
+ var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+ var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
+ 101, 102]);
+ var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
+ var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+
+ var stream = this.stream;
+ stream.pos = 0;
+ var buffer = stream.getBytes();
+ var position = stream.start, length = buffer.length;
+ var trailers = [], xrefStms = [];
+ var state = 0;
+ var currentToken;
+ while (position < length) {
+ var ch = buffer[position];
+ if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
+ ++position;
+ continue;
+ }
+ if (ch === 37) { // %-comment
+ do {
+ ++position;
+ ch = buffer[position];
+ } while (ch !== 13 && ch !== 10);
+ continue;
+ }
+ var token = readToken(buffer, position);
+ var m;
+ if (token === 'xref') {
+ position += skipUntil(buffer, position, trailerBytes);
+ trailers.push(position);
+ position += skipUntil(buffer, position, startxrefBytes);
+ } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
+ this.entries[m[1]] = {
+ offset: position,
+ gen: m[2] | 0,
+ uncompressed: true
+ };
+
+ var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
+ var content = buffer.subarray(position, position + contentLength);
+
+ // checking XRef stream suspect
+ // (it shall have '/XRef' and next char is not a letter)
+ var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+ if (xrefTagOffset < contentLength &&
+ content[xrefTagOffset + 5] < 64) {
+ xrefStms.push(position);
+ this.xrefstms[position] = 1; // don't read it recursively
+ }
+
+ position += contentLength;
+ } else
+ position += token.length + 1;
+ }
+ // reading XRef streams
+ for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
+ this.readXRef(xrefStms[i]);
+ }
+ // finding main trailer
+ var dict;
+ for (var i = 0, ii = trailers.length; i < ii; ++i) {
+ stream.pos = trailers[i];
+ var parser = new Parser(new Lexer(stream), true);
+ var obj = parser.getObj();
+ if (!isCmd(obj, 'trailer'))
+ continue;
+ // read the trailer dictionary
+ if (!isDict(dict = parser.getObj()))
+ continue;
+ // taking the first one with 'ID'
+ if (dict.has('ID'))
+ return dict;
+ }
+ // no tailer with 'ID', taking last one (if exists)
+ if (dict)
+ return dict;
+ // nothing helps
+ error('Invalid PDF structure');
+ return null;
+ },
+ readXRef: function readXref(startXRef) {
+ var stream = this.stream;
+ stream.pos = startXRef;
+ var parser = new Parser(new Lexer(stream), true);
+ var obj = parser.getObj();
+ // parse an old-style xref table
+ if (isCmd(obj, 'xref'))
+ return this.readXRefTable(parser);
+ // parse an xref stream
+ if (isInt(obj)) {
+ if (!isInt(parser.getObj()) ||
+ !isCmd(parser.getObj(), 'obj') ||
+ !isStream(obj = parser.getObj())) {
+ error('Invalid XRef stream');
+ }
+ return this.readXRefStream(obj);
+ }
+ return this.indexObjects();
+ },
+ getEntry: function xRefGetEntry(i) {
+ var e = this.entries[i];
+ if (e.free)
+ error('reading an XRef stream not implemented yet');
+ return e;
+ },
+ fetchIfRef: function xRefFetchIfRef(obj) {
+ if (!isRef(obj))
+ return obj;
+ return this.fetch(obj);
+ },
+ fetch: function xRefFetch(ref, suppressEncryption) {
+ var num = ref.num;
+ var e = this.cache[num];
+ if (e)
+ return e;
+
+ e = this.getEntry(num);
+ var gen = ref.gen;
+ var stream, parser;
+ if (e.uncompressed) {
+ if (e.gen != gen)
+ throw ('inconsistent generation in XRef');
+ stream = this.stream.makeSubStream(e.offset);
+ parser = new Parser(new Lexer(stream), true, this);
+ var obj1 = parser.getObj();
+ var obj2 = parser.getObj();
+ var obj3 = parser.getObj();
+ if (!isInt(obj1) || obj1 != num ||
+ !isInt(obj2) || obj2 != gen ||
+ !isCmd(obj3)) {
+ error('bad XRef entry');
+ }
+ if (!isCmd(obj3, 'obj')) {
+ // some bad pdfs use "obj1234" and really mean 1234
+ if (obj3.cmd.indexOf('obj') == 0) {
+ num = parseInt(obj3.cmd.substring(3), 10);
+ if (!isNaN(num))
+ return num;
+ }
+ error('bad XRef entry');
+ }
+ if (this.encrypt && !suppressEncryption) {
+ try {
+ e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
+ } catch (ex) {
+ // almost all streams must be encrypted, but sometimes
+ // they are not probably due to some broken generators
+ // re-trying without encryption
+ return this.fetch(ref, true);
+ }
+ } else {
+ e = parser.getObj();
+ }
+ // Don't cache streams since they are mutable (except images).
+ if (!isStream(e) || e.getImage)
+ this.cache[num] = e;
+ return e;
+ }
+
+ // compressed entry
+ stream = this.fetch(new Ref(e.offset, 0));
+ if (!isStream(stream))
+ error('bad ObjStm stream');
+ var first = stream.parameters.get('First');
+ var n = stream.parameters.get('N');
+ if (!isInt(first) || !isInt(n)) {
+ error('invalid first and n parameters for ObjStm stream');
+ }
+ parser = new Parser(new Lexer(stream), false);
+ var i, entries = [], nums = [];
+ // read the object numbers to populate cache
+ for (i = 0; i < n; ++i) {
+ num = parser.getObj();
+ if (!isInt(num)) {
+ error('invalid object number in the ObjStm stream: ' + num);
+ }
+ nums.push(num);
+ var offset = parser.getObj();
+ if (!isInt(offset)) {
+ error('invalid object offset in the ObjStm stream: ' + offset);
+ }
+ }
+ // read stream objects for cache
+ for (i = 0; i < n; ++i) {
+ entries.push(parser.getObj());
+ this.cache[nums[i]] = entries[i];
+ }
+ e = entries[e.gen];
+ if (!e) {
+ error('bad XRef entry for compressed object');
+ }
+ return e;
+ },
+ getCatalogObj: function xRefGetCatalogObj() {
+ return this.fetch(this.root);
+ }
+ };
+
+ return constructor;
+})();
+
+/**
+ * A PDF document and page is built of many objects. E.g. there are objects
+ * for fonts, images, rendering code and such. These objects might get processed
+ * inside of a worker. The `PDFObjects` implements some basic functions to
+ * manage these objects.
+ */
+var PDFObjects = (function pdfObjects() {
+ function PDFObjects() {
+ this.objs = {};
+ }
+
+ PDFObjects.prototype = {
+ objs: null,
+
+ /**
+ * Internal function.
+ * Ensures there is an object defined for `objId`. Stores `data` on the
+ * object *if* it is created.
+ */
+ ensureObj: function pdfObjectsEnsureObj(objId, data) {
+ if (this.objs[objId])
+ return this.objs[objId];
+ return this.objs[objId] = new Promise(objId, data);
+ },
+
+ /**
+ * If called *without* callback, this returns the data of `objId` but the
+ * object needs to be resolved. If it isn't, this function throws.
+ *
+ * If called *with* a callback, the callback is called with the data of the
+ * object once the object is resolved. That means, if you call this
+ * function and the object is already resolved, the callback gets called
+ * right away.
+ */
+ get: function pdfObjectsGet(objId, callback) {
+ // If there is a callback, then the get can be async and the object is
+ // not required to be resolved right now
+ if (callback) {
+ this.ensureObj(objId).then(callback);
+ return null;
+ }
+
+ // If there isn't a callback, the user expects to get the resolved data
+ // directly.
+ var obj = this.objs[objId];
+
+ // If there isn't an object yet or the object isn't resolved, then the
+ // data isn't ready yet!
+ if (!obj || !obj.isResolved) {
+ throw 'Requesting object that isn\'t resolved yet ' + objId;
+ return null;
+ } else {
+ return obj.data;
+ }
+ },
+
+ /**
+ * Resolves the object `objId` with optional `data`.
+ */
+ resolve: function pdfObjectsResolve(objId, data) {
+ var objs = this.objs;
+
+ // In case there is a promise already on this object, just resolve it.
+ if (objs[objId]) {
+ objs[objId].resolve(data);
+ } else {
+ this.ensureObj(objId, data);
+ }
+ },
+
+ onData: function pdfObjectsOnData(objId, callback) {
+ this.ensureObj(objId).onData(callback);
+ },
+
+ isResolved: function pdfObjectsIsResolved(objId) {
+ var objs = this.objs;
+ if (!objs[objId]) {
+ return false;
+ } else {
+ return objs[objId].isResolved;
+ }
+ },
+
+ hasData: function pdfObjectsHasData(objId) {
+ var objs = this.objs;
+ if (!objs[objId]) {
+ return false;
+ } else {
+ return objs[objId].hasData;
+ }
+ },
+
+ /**
+ * Sets the data of an object but *doesn't* resolve it.
+ */
+ setData: function pdfObjectsSetData(objId, data) {
+ // Watchout! If you call `this.ensureObj(objId, data)` you're going to
+ // create a *resolved* promise which shouldn't be the case!
+ this.ensureObj(objId).data = data;
+ }
+ };
+ return PDFObjects;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFFunction = (function pdfFunction() {
+ var CONSTRUCT_SAMPLED = 0;
+ var CONSTRUCT_INTERPOLATED = 2;
+ var CONSTRUCT_STICHED = 3;
+ var CONSTRUCT_POSTSCRIPT = 4;
+
+ return {
+ getSampleArray: function pdfFunctionGetSampleArray(size, outputSize, bps,
+ str) {
+ var length = 1;
+ for (var i = 0, ii = size.length; i < ii; i++)
+ length *= size[i];
+ length *= outputSize;
+
+ var array = [];
+ var codeSize = 0;
+ var codeBuf = 0;
+ // 32 is a valid bps so shifting won't work
+ var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+ var strBytes = str.getBytes((length * bps + 7) / 8);
+ var strIdx = 0;
+ for (var i = 0; i < length; i++) {
+ while (codeSize < bps) {
+ codeBuf <<= 8;
+ codeBuf |= strBytes[strIdx++];
+ codeSize += 8;
+ }
+ codeSize -= bps;
+ array.push((codeBuf >> codeSize) * sampleMul);
+ codeBuf &= (1 << codeSize) - 1;
+ }
+ return array;
+ },
+
+ getIR: function pdfFunctionGetIR(xref, fn) {
+ var dict = fn.dict;
+ if (!dict)
+ dict = fn;
+
+ var types = [this.constructSampled,
+ null,
+ this.constructInterpolated,
+ this.constructStiched,
+ this.constructPostScript];
+
+ var typeNum = dict.get('FunctionType');
+ var typeFn = types[typeNum];
+ if (!typeFn)
+ error('Unknown type of function');
+
+ return typeFn.call(this, fn, dict, xref);
+ },
+
+ fromIR: function pdfFunctionFromIR(IR) {
+ var type = IR[0];
+ switch (type) {
+ case CONSTRUCT_SAMPLED:
+ return this.constructSampledFromIR(IR);
+ case CONSTRUCT_INTERPOLATED:
+ return this.constructInterpolatedFromIR(IR);
+ case CONSTRUCT_STICHED:
+ return this.constructStichedFromIR(IR);
+ case CONSTRUCT_POSTSCRIPT:
+ default:
+ return this.constructPostScriptFromIR(IR);
+ }
+ },
+
+ parse: function pdfFunctionParse(xref, fn) {
+ var IR = this.getIR(xref, fn);
+ return this.fromIR(IR);
+ },
+
+ constructSampled: function pdfFunctionConstructSampled(str, dict) {
+ function toMultiArray(arr) {
+ var inputLength = arr.length;
+ var outputLength = arr.length / 2;
+ var out = new Array(outputLength);
+ var index = 0;
+ for (var i = 0; i < inputLength; i += 2) {
+ out[index] = [arr[i], arr[i + 1]];
+ ++index;
+ }
+ return out;
+ }
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain || !range)
+ error('No domain or range');
+
+ var inputSize = domain.length / 2;
+ var outputSize = range.length / 2;
+
+ domain = toMultiArray(domain);
+ range = toMultiArray(range);
+
+ var size = dict.get('Size');
+ var bps = dict.get('BitsPerSample');
+ var order = dict.get('Order');
+ if (!order)
+ order = 1;
+ if (order !== 1)
+ error('No support for cubic spline interpolation: ' + order);
+
+ var encode = dict.get('Encode');
+ if (!encode) {
+ encode = [];
+ for (var i = 0; i < inputSize; ++i) {
+ encode.push(0);
+ encode.push(size[i] - 1);
+ }
+ }
+ encode = toMultiArray(encode);
+
+ var decode = dict.get('Decode');
+ if (!decode)
+ decode = range;
+ else
+ decode = toMultiArray(decode);
+
+ // Precalc the multipliers
+ var inputMul = new Float64Array(inputSize);
+ for (var i = 0; i < inputSize; ++i) {
+ inputMul[i] = (encode[i][1] - encode[i][0]) /
+ (domain[i][1] - domain[i][0]);
+ }
+
+ var idxMul = new Int32Array(inputSize);
+ idxMul[0] = outputSize;
+ for (i = 1; i < inputSize; ++i) {
+ idxMul[i] = idxMul[i - 1] * size[i - 1];
+ }
+
+ var nSamples = outputSize;
+ for (i = 0; i < inputSize; ++i)
+ nSamples *= size[i];
+
+ var samples = this.getSampleArray(size, outputSize, bps, str);
+
+ return [
+ CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+ outputSize, bps, range, inputMul, idxMul, nSamples
+ ];
+ },
+
+ constructSampledFromIR: function pdfFunctionConstructSampledFromIR(IR) {
+ var inputSize = IR[1];
+ var domain = IR[2];
+ var encode = IR[3];
+ var decode = IR[4];
+ var samples = IR[5];
+ var size = IR[6];
+ var outputSize = IR[7];
+ var bps = IR[8];
+ var range = IR[9];
+ var inputMul = IR[10];
+ var idxMul = IR[11];
+ var nSamples = IR[12];
+
+ return function constructSampledFromIRResult(args) {
+ if (inputSize != args.length)
+ error('Incorrect number of arguments: ' + inputSize + ' != ' +
+ args.length);
+ // Most of the below is a port of Poppler's implementation.
+ // TODO: There's a few other ways to do multilinear interpolation such
+ // as piecewise, which is much faster but an approximation.
+ var out = new Float64Array(outputSize);
+ var x;
+ var e = new Array(inputSize);
+ var efrac0 = new Float64Array(inputSize);
+ var efrac1 = new Float64Array(inputSize);
+ var sBuf = new Float64Array(1 << inputSize);
+ var i, j, k, idx, t;
+
+ // map input values into sample array
+ for (i = 0; i < inputSize; ++i) {
+ x = (args[i] - domain[i][0]) * inputMul[i] + encode[i][0];
+ if (x < 0) {
+ x = 0;
+ } else if (x > size[i] - 1) {
+ x = size[i] - 1;
+ }
+ e[i] = [Math.floor(x), 0];
+ if ((e[i][1] = e[i][0] + 1) >= size[i]) {
+ // this happens if in[i] = domain[i][1]
+ e[i][1] = e[i][0];
+ }
+ efrac1[i] = x - e[i][0];
+ efrac0[i] = 1 - efrac1[i];
+ }
+
+ // for each output, do m-linear interpolation
+ for (i = 0; i < outputSize; ++i) {
+
+ // pull 2^m values out of the sample array
+ for (j = 0; j < (1 << inputSize); ++j) {
+ idx = i;
+ for (k = 0, t = j; k < inputSize; ++k, t >>= 1) {
+ idx += idxMul[k] * (e[k][t & 1]);
+ }
+ if (idx >= 0 && idx < nSamples) {
+ sBuf[j] = samples[idx];
+ } else {
+ sBuf[j] = 0; // TODO Investigate if this is what Adobe does
+ }
+ }
+
+ // do m sets of interpolations
+ for (j = 0, t = (1 << inputSize); j < inputSize; ++j, t >>= 1) {
+ for (k = 0; k < t; k += 2) {
+ sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k + 1];
+ }
+ }
+
+ // map output value to range
+ out[i] = (sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0]);
+ if (out[i] < range[i][0]) {
+ out[i] = range[i][0];
+ } else if (out[i] > range[i][1]) {
+ out[i] = range[i][1];
+ }
+ }
+ return out;
+ }
+ },
+
+ constructInterpolated:
+ function pdfFunctionConstructInterpolated(str, dict) {
+ var c0 = dict.get('C0') || [0];
+ var c1 = dict.get('C1') || [1];
+ var n = dict.get('N');
+
+ if (!isArray(c0) || !isArray(c1))
+ error('Illegal dictionary for interpolated function');
+
+ var length = c0.length;
+ var diff = [];
+ for (var i = 0; i < length; ++i)
+ diff.push(c1[i] - c0[i]);
+
+ return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+ },
+
+ constructInterpolatedFromIR:
+ function pdfFunctionconstructInterpolatedFromIR(IR) {
+ var c0 = IR[1];
+ var diff = IR[2];
+ var n = IR[3];
+
+ var length = diff.length;
+
+ return function constructInterpolatedFromIRResult(args) {
+ var x = n == 1 ? args[0] : Math.pow(args[0], n);
+
+ var out = [];
+ for (var j = 0; j < length; ++j)
+ out.push(c0[j] + (x * diff[j]));
+
+ return out;
+
+ }
+ },
+
+ constructStiched: function pdfFunctionConstructStiched(fn, dict, xref) {
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain)
+ error('No domain');
+
+ var inputSize = domain.length / 2;
+ if (inputSize != 1)
+ error('Bad domain for stiched function');
+
+ var fnRefs = dict.get('Functions');
+ var fns = [];
+ for (var i = 0, ii = fnRefs.length; i < ii; ++i)
+ fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+
+ var bounds = dict.get('Bounds');
+ var encode = dict.get('Encode');
+
+ return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+ },
+
+ constructStichedFromIR: function pdfFunctionConstructStichedFromIR(IR) {
+ var domain = IR[1];
+ var bounds = IR[2];
+ var encode = IR[3];
+ var fnsIR = IR[4];
+ var fns = [];
+
+ for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+ fns.push(PDFFunction.fromIR(fnsIR[i]));
+ }
+
+ return function constructStichedFromIRResult(args) {
+ var clip = function constructStichedFromIRClip(v, min, max) {
+ if (v > max)
+ v = max;
+ else if (v < min)
+ v = min;
+ return v;
+ };
+
+ // clip to domain
+ var v = clip(args[0], domain[0], domain[1]);
+ // calulate which bound the value is in
+ for (var i = 0, ii = bounds.length; i < ii; ++i) {
+ if (v < bounds[i])
+ break;
+ }
+
+ // encode value into domain of function
+ var dmin = domain[0];
+ if (i > 0)
+ dmin = bounds[i - 1];
+ var dmax = domain[1];
+ if (i < bounds.length)
+ dmax = bounds[i];
+
+ var rmin = encode[2 * i];
+ var rmax = encode[2 * i + 1];
+
+ var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+ // call the appropropriate function
+ return fns[i]([v2]);
+ };
+ },
+
+ constructPostScript: function pdfFunctionConstructPostScript() {
+ return [CONSTRUCT_POSTSCRIPT];
+ },
+
+ constructPostScriptFromIR: function pdfFunctionConstructPostScriptFromIR() {
+ TODO('unhandled type of function');
+ return function constructPostScriptFromIRResult() {
+ return [255, 105, 180];
+ };
+ }
+ };
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ISOAdobeCharset = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
+ 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
+ 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
+ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
+ 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
+ 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
+ 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
+ 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
+ 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
+ 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
+ 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
+ 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
+ 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
+ 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
+ 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
+ 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
+ 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
+ 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
+ 'ugrave', 'yacute', 'ydieresis', 'zcaron'
+];
+
+var ExpertCharset = [
+ '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
+ 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+ 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+ 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+ 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+ 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
+ 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
+ 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+ 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+ 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+ 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+ 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+ 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
+ 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
+ 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
+ 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
+ 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
+ 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'
+];
+
+var ExpertSubsetCharset = [
+ '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+ 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+ 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+ 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
+ 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
+ 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior'
+];
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var CIDToUnicodeMaps = {
+ 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
+ {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
+ [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
+ 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
+ [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
+ [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
+ 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
+ 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
+ {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
+ {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
+ {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
+ {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
+ {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
+ {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
+ 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
+ {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
+ [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
+ 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
+ {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
+ 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
+ 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
+ {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
+ 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
+ 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
+ {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
+ {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
+ {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
+ {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
+ 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
+ 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
+ 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
+ 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
+ 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
+ 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
+ [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
+ 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
+ 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
+ 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
+ [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
+ [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
+ 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
+ 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
+ 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
+ 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
+ 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
+ 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
+ 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
+ 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
+ [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
+ 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
+ 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
+ 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
+ [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
+ 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
+ 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
+ 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
+ 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
+ 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
+ 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
+ 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
+ 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
+ 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
+ [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
+ 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
+ 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
+ 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
+ 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
+ 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
+ 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
+ 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
+ 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
+ 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
+ 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
+ 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
+ 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
+ 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
+ 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
+ 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
+ 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
+ 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
+ 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
+ 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
+ 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
+ [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
+ 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
+ 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
+ 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
+ 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
+ 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
+ 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
+ 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
+ [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
+ [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
+ 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
+ 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
+ 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
+ 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
+ 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
+ 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
+ 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
+ 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
+ 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
+ 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
+ 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
+ [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
+ 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
+ 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
+ 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
+ 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
+ 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
+ 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
+ [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
+ 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
+ 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
+ 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
+ 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
+ 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
+ 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
+ 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
+ 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
+ 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
+ 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
+ [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
+ 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
+ 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
+ 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
+ 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
+ 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
+ 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
+ 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
+ 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
+ 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
+ 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
+ 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
+ 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
+ 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
+ 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
+ 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
+ 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
+ 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
+ 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
+ [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
+ 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
+ [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
+ 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
+ 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
+ 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
+ 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
+ [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
+ 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
+ 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
+ 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
+ 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
+ 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
+ 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
+ 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
+ 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
+ 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
+ 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
+ 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
+ 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
+ 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
+ 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
+ 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
+ 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
+ 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
+ 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
+ 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
+ [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
+ 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
+ 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
+ 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
+ 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
+ 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
+ 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
+ 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
+ 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
+ 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
+ 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
+ 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
+ [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
+ 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
+ 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
+ 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
+ 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
+ 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
+ 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
+ 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
+ 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
+ [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
+ 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
+ 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
+ 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
+ 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
+ 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
+ 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
+ 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
+ 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
+ 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
+ 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
+ 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
+ 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
+ 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
+ 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
+ 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
+ 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
+ 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
+ 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
+ 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
+ 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
+ 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
+ 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
+ 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
+ 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
+ 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
+ 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
+ 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
+ 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
+ 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
+ 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
+ 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
+ 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
+ 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
+ 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
+ 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
+ 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
+ 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
+ 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
+ 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
+ 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
+ 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
+ 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
+ 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
+ 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
+ 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
+ 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
+ [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
+ 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
+ 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
+ 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
+ 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
+ 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
+ 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
+ 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
+ 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
+ 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
+ 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
+ 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
+ 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
+ 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
+ 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
+ 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
+ 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
+ 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
+ [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
+ 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
+ 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
+ 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
+ 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
+ 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
+ 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
+ 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
+ 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
+ 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
+ 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
+ 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
+ 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
+ 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
+ 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
+ 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
+ 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
+ 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
+ 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
+ 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
+ [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
+ 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
+ [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
+ 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
+ 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
+ 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
+ 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
+ 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
+ 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
+ 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
+ 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
+ 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
+ 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
+ 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
+ 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
+ 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
+ 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
+ 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
+ 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
+ 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
+ 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
+ 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
+ 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
+ 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
+ {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
+ 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
+ [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
+ 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
+ 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
+ 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
+ [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
+ 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
+ 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
+ [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
+ 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
+ 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
+ [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
+ 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
+ [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
+ 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
+ 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
+ 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
+ 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
+ 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
+ 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
+ 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
+ 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
+ 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
+ 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
+ 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
+ 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
+ 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
+ [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
+ 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
+ [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
+ 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
+ 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
+ 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
+ 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
+ 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
+ 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
+ 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
+ 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
+ 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
+ [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
+ 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
+ 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
+ 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
+ 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
+ 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
+ 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
+ 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
+ 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
+ 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
+ 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
+ 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
+ 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
+ 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
+ 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
+ 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
+ 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
+ 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
+ {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
+ 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
+ [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
+ 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
+ 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
+ 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
+ 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
+ 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
+ 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
+ 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
+ [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
+ 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
+ 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
+ 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
+ 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
+ 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
+ {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
+ 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
+ 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
+ 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
+ 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
+ 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
+ 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
+ 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
+ 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
+ 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
+ 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
+ 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
+ {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
+ 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
+ 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
+ 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
+ {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
+ 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
+ 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
+ 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
+ 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
+ {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
+ 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
+ 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
+ {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
+ [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
+ 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
+ {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
+ [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
+ 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
+ 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
+ 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
+ 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
+ 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
+ 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
+ [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
+ {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
+ 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
+ [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
+ 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
+ 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
+ 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
+ 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
+ [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
+ 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
+ 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
+ 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
+ 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
+ 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
+ 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
+ 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
+ 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
+ {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
+ 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
+ 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
+ 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
+ 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
+ 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
+ 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
+ {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
+ 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
+ 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
+ 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
+ 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
+ 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
+ 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
+ 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
+ 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
+ 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
+ {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
+ 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
+ [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
+ 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
+ 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
+ [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
+ {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
+ 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
+ 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
+ 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
+ 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
+ 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
+ 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
+ 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
+ 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
+ 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
+ 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
+ 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
+ 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
+ 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
+ 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
+ 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
+ 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
+ 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
+ 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
+ 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
+ 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
+ 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
+ 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
+ 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
+ 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
+ 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
+ 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
+ [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
+ 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
+ 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
+ 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
+ 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
+ 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
+ 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
+ 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
+ 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
+ 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
+ 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
+ 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
+ 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
+ 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
+ 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
+ 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
+ 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
+ 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
+ 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
+ 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
+ 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
+ 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
+ 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
+ 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
+ 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
+ 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
+ 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
+ {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
+ 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
+ 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
+ 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
+ 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
+ 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
+ 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
+ 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
+ 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
+ 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
+ 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
+ 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
+ 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
+ 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
+ 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
+ {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
+ 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
+ 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
+ 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
+ {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
+ 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
+ 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
+ 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
+ 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
+ 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
+ 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
+ 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
+ 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
+ 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
+ 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
+ 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
+ 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
+ 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
+ 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
+ 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
+ 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
+ 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
+ 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
+ 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
+ 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
+ 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
+ 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
+ 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
+ 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
+ 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
+ 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
+ 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
+ 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
+ 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
+ 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
+ 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
+ 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
+ {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
+ {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
+ [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
+ 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
+ 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
+ {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
+ 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
+ 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
+ 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
+ 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
+ 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
+ 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
+ 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
+ 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
+ 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
+ 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
+ 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
+ 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
+ {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
+ 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
+ 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
+ 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
+ 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
+ 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
+ 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
+ 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
+ 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
+ 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
+ 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
+ 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
+ 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
+ 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
+ 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
+ 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
+ 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
+ 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
+ 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
+ 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
+ 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
+ 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
+ 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
+ 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
+ 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
+ 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
+ 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
+ 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
+ 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
+ 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
+ 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
+ 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
+ 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
+ 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
+ {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
+ 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
+ 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
+ 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
+ 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
+ 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
+ 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
+ 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
+ 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
+ [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
+ 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
+ {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
+ {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
+ 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
+ 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
+ {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
+ {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
+ 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
+ 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
+ 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
+ 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
+ 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
+ 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
+ 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
+ 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
+ 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
+ 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
+ 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
+ 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
+ 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
+ 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
+ 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
+ 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
+ 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
+ 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
+ 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
+ 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
+ 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
+ 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
+ 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
+ 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
+ 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
+ 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
+ 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
+ {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
+ 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
+ {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
+ 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
+ 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
+ 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
+ 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
+ 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
+ {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
+ [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
+ 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
+ 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
+ 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
+ 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
+ {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
+ 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
+ {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
+ 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
+ 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
+ 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
+ {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
+ 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
+ {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
+ 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
+ {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
+ 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
+ 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
+ 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
+ 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
+ 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
+ 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
+ {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
+ 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
+ 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
+ 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
+ {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
+ 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
+ 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
+ {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
+ 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
+ {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
+ 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
+ {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
+ 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
+ {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
+ 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
+ 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
+ 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
+ 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
+ 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
+ {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
+ 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
+ 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
+ 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
+ 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
+ {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
+ 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
+ {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
+ {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
+ {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
+ 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
+ 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
+ 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
+ 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
+ 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
+ {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
+ {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
+ 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
+ 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
+ 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
+ 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
+ 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
+ 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
+ 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
+ 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
+ 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
+ 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
+ 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
+ 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
+ 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
+ [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
+ 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
+ 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
+ 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
+ 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
+ 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
+ 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
+ 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
+ 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
+ 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
+ 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
+ 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
+ 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
+ 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
+ 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
+ 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
+ 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
+ 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
+ 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
+ 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
+ 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
+ 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
+ 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
+ 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
+ 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
+ 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
+ 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
+ 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
+ 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
+ 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
+ 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
+ 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
+ {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
+ 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
+ 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
+ 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
+ {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
+ 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
+ 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
+ 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
+ {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
+ {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
+ {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
+ 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
+ {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
+ 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
+ {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
+ 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
+ {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
+ {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
+ 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
+ {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
+ {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
+ {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
+ {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
+ {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
+ {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
+ 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
+ {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
+ 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
+ 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
+ {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
+ 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
+ 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
+ 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
+ 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
+ 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
+ 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
+ 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
+ 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
+ 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
+ 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
+ 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
+ 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
+ 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
+ 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
+ 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
+ {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
+ [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
+ 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
+ {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
+ [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
+ {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
+ 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
+ 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
+ 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
+ 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
+ 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
+ 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
+ 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
+ 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
+ {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
+ 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
+ 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
+ [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
+ 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
+ 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
+ {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
+ 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
+ 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
+ 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
+ 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
+ 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
+ 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
+ [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
+ {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
+ 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
+ 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
+ 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
+ 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
+ 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
+ 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
+ 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
+ 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
+ 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
+ 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
+ {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
+ 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
+ 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
+ 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
+ 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
+ [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
+ [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
+ 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
+ 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
+ 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
+ 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
+ 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
+ {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
+ 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
+ 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
+ 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
+ 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
+ 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
+ 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
+ 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
+ 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
+ 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
+ [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
+ 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
+ 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
+ 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
+ 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
+ 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
+ [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
+ 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
+ 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
+ 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
+ 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
+ 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
+ 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
+ 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
+ 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
+ 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
+ [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
+ 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
+ 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
+ {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
+ 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
+ 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
+ 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
+ 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
+ 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
+ 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
+ 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
+ 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
+ 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
+ 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
+ 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
+ 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
+ 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
+ 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
+ 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
+ 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
+ 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
+ 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
+ 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
+ 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
+ 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
+ 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
+ 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
+ [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
+ {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
+ 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
+ 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
+ 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
+ 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
+ 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
+ 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
+ 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
+ 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
+ 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
+ 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
+ {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
+ 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
+ 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
+ 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
+ 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
+ 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
+ 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
+ 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
+ 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
+ {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
+ 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
+ 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
+ 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
+ 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
+ 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
+ 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
+ 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
+ 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
+ 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
+ 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
+ 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
+ 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
+ {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
+ {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
+ {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
+ 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
+ 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
+ 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
+ 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
+ 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
+ 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
+ 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
+ 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
+ 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
+ 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
+ {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
+ 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
+ {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
+ {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
+ {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
+ 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
+ {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
+ {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
+ 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
+ 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
+ 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
+ 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
+ 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
+ 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
+ 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
+ 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
+ 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
+ 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
+ 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
+ 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
+ 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
+ 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
+ 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
+ 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
+ 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
+ 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
+ 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
+ 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
+ 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
+ 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
+ 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
+ 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
+ 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
+ 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
+ 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
+ {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
+ 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
+ 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
+ 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
+ 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
+ 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
+ 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
+ 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
+ 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
+ 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
+ {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
+ 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
+ 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
+ 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
+ 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
+ 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
+ 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
+ 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
+ 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
+ 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
+ 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
+ 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
+ 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
+ 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
+ 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
+ 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
+ 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
+ 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
+ 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
+ {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
+ 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
+ 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
+ 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
+ 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
+ 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
+ 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
+ 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
+ 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
+ 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
+ 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
+ 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
+ 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
+ {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
+ 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
+ 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
+ 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
+ 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
+ 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
+ {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
+ 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
+ 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
+ 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
+ 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
+ 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
+ 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
+ {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
+ 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
+ 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
+ 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
+ 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
+ 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
+ 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
+ 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
+ {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
+ 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
+ {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
+ 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
+ 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
+ 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
+ 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
+ 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
+ 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
+ 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
+ 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
+ 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
+ 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
+ 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
+ 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
+ {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
+ 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
+ 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
+ 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
+ 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
+ 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
+ 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
+ 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
+ {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
+ 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
+ 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
+ {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
+ {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
+ 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
+ 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
+ {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
+ 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
+ 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
+ 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
+ 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
+ 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
+ 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
+ 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
+ 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
+ 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
+ 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
+ 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
+ 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
+ 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
+ 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
+ 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
+ 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
+ {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
+ {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
+ 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
+ {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
+ 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
+ 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
+ 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
+ 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
+ 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
+ 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
+ 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
+ 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
+ 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
+ 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
+ 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
+ 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
+ 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
+ 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
+ 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
+ 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
+ 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
+ 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
+ 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
+ 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
+ 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
+ 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
+ {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
+ 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
+ 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
+ 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
+ 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
+ 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
+ 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
+ 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
+ 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
+ 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
+ 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
+ {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
+ 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
+ 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
+ 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
+ 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
+ {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
+ 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
+ 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
+ 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
+ {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
+ 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
+ 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
+ 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
+ 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
+ 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
+ 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
+ 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
+ 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
+ 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
+ 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
+ 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
+ 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
+ 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
+ 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
+ {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
+ 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
+ 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
+ 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
+ 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
+ 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
+ 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
+ {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
+ {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
+ 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
+ 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
+ {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
+ 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
+ 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
+ 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
+ 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
+ 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
+ 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
+ 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
+ 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
+ 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
+ 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
+ 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
+ {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
+ {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
+ 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
+ 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
+ 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
+ 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
+ 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
+ {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
+ 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
+ {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
+ 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
+ {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
+ 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
+ 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
+ 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
+ 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
+ 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
+ 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
+ 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
+ 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
+ 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
+ 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
+ {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
+ 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
+ {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
+ 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
+ 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
+ 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
+ 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
+ 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
+ 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
+ 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
+ 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
+ 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
+ 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
+ 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
+ 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
+ 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
+ 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
+ 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
+ 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
+ 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
+ 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
+ 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
+ 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
+ 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
+ {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
+ 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
+ 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
+ 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
+ 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
+ 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
+ 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
+ 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
+ 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
+ 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
+ {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
+ 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
+ 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
+ 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
+ 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
+ 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
+ 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
+ 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
+ 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
+ {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
+ 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
+ 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
+ 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
+ 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
+ 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
+ {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
+ 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
+ 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
+ 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
+ {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
+ 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
+ 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
+ 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
+ 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
+ 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
+ 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
+ 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
+ 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
+ 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
+ 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
+ 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
+ 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
+ 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
+ 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
+ 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
+ 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
+ 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
+ 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
+ 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
+ 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
+ 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
+ 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
+ {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
+ 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
+ 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
+ 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
+ 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
+ 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
+ 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
+ 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
+ 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
+ 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
+ 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
+ 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
+ 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
+ {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
+ 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
+ {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
+ {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
+ 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
+ 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
+ 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
+ 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
+ 38315, 38741, 171581, 173594],
+ 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
+ {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
+ 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
+ {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
+ {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
+ 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
+ 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
+ {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
+ {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
+ {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
+ 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
+ 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
+ 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
+ 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
+ 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
+ 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
+ {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
+ {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
+ 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
+ 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
+ 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
+ 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
+ {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
+ {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
+ {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
+ 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
+ {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
+ 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
+ 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
+ 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
+ {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
+ {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
+ 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
+ {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
+ {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
+ 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
+ {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
+ {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
+ 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
+ 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
+ {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
+ {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
+ 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
+ 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
+ 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
+ {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
+ 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
+ {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
+ {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
+ {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
+ 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
+ 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
+ {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
+ 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
+ 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
+ {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
+ {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
+ {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
+ {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
+ {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
+ {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
+ {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
+ {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
+ 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
+ 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
+ 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
+ {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
+ {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
+ {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
+ {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
+ {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
+ {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
+ {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
+ 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
+ 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
+ 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
+ {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
+ 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
+ {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
+ {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
+ {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
+ 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
+ {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
+ {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
+ {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
+ {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
+ 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
+ {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
+ 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
+ {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
+ {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
+ 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
+ {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
+ 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
+ {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
+ {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
+ {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
+ {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
+ {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
+ 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
+ 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
+ {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
+ {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
+ 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
+ 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
+ {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
+ {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
+ {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
+ {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
+ 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
+ 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
+ {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
+ {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
+ 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
+ {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
+ {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
+ {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
+ 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
+ {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
+ {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
+ 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
+ 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
+ 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
+ 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
+ {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
+ 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
+ {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
+ 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
+ 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
+ {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
+ {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
+ {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
+ {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
+ 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
+ {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
+ 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
+ {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
+ 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
+ {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
+ {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
+ 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
+ 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
+ {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
+ {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
+ {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
+ {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
+ {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
+ {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
+ {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
+ 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
+ {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
+ 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
+ {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
+ {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
+ {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
+ {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
+ {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
+ {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
+ {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
+ 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
+ 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
+ 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
+ {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
+ {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
+ {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
+ 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
+ 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
+ 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
+ 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
+ {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
+ {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
+ 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
+ {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
+ {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
+ {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
+ 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
+ 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
+ {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
+ {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
+ {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
+ {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
+ {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
+ 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
+ {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
+ {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
+ {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
+ {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
+ {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
+ {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
+ {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
+ 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
+ {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
+ {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
+ {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
+ {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
+ 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
+ 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
+ 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
+ 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
+ {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
+ {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
+ {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
+ 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
+ {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
+ {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
+ {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
+ {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
+ 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
+ {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
+ {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
+ 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
+ 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
+ {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
+ 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
+ {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
+ {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
+ {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
+ {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
+ {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
+ {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
+ {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
+ 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
+ {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
+ {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
+ {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
+ 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
+ {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
+ {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
+ {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
+ 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
+ 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
+ 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
+ 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
+ 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
+ {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
+ 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
+ {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
+ {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
+ {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
+ 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
+ {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
+ {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
+ 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
+ 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
+ {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
+ {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
+ 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
+ {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
+ 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
+ {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
+ {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
+ 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
+ {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
+ 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
+ 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
+ {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
+ {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
+ 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
+ {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
+ {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
+ {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
+ 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
+ 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
+ {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
+ {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
+ 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
+ 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
+ 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
+ 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
+ {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
+ {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
+ {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
+ 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
+ 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
+ {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
+ 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
+ {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
+ 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
+ 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
+ {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
+ 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
+ {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
+ {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
+ 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
+ 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
+ {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
+ 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
+ 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
+ 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
+ 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
+ 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
+ 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
+ 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
+ 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
+ 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
+ {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
+ 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
+ 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
+ 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
+ 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
+ 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
+ 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
+ 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
+ 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
+ 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
+ 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
+ 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
+ [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
+ 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
+ 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
+ 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
+ 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
+ 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
+ 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
+ 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
+ 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
+ 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
+ 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
+ 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
+ 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
+ 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
+ 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
+ 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
+ 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
+ [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
+ 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
+ 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
+ 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
+ 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
+ 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
+ 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
+ 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
+ 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
+ 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
+ [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
+ 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
+ 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
+ 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
+ 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
+ [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
+ 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
+ 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
+ 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
+ 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
+ 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
+ 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
+ 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
+ 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
+ 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
+ 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
+ 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
+ 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
+ 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
+ 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
+ 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
+ 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
+ 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
+ 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
+ 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
+ [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
+ 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
+ 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
+ [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
+ 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
+ [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
+ [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
+ [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
+ [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
+ 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
+ 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
+ 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
+ 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
+ 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
+ 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
+ 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
+ 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
+ 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
+ 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
+ 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
+ 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
+ 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
+ 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
+ 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
+ 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
+ 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
+ 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
+ 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
+ [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
+ [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
+ [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
+ [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
+ [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
+ 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
+ [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
+ [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
+ [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
+ [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
+ [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
+ [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
+ [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
+ [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
+ [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
+ [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
+ [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
+ [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
+ [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
+ [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
+ [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
+ 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
+ [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
+ 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
+ [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
+ 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
+ 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
+ [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
+ [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
+ [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
+ [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
+ [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
+ [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
+ [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
+ [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
+ [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
+ [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
+ [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
+ [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
+ [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
+ [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
+ [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
+ [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
+ 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
+ [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
+ [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
+ [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
+ [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
+ [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
+ [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
+ [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
+ [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
+ [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
+ 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
+ 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
+ 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
+ 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
+ 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
+ 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
+ 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
+ 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
+ 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
+ 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
+ [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
+ 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
+ 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
+ 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
+ [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
+ 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
+ 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
+ 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
+ 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
+ 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
+ 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
+ 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
+ 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
+ [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
+ 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
+ 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
+ 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
+ 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
+ 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
+ [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
+ 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
+ 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
+ [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
+ 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
+ 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
+ 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
+ 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
+ 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
+ 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
+ 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
+ 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
+ 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
+ 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
+ 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
+ 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
+ [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
+ 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
+ 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
+ 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
+ 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
+ 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
+ [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
+ 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
+ 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
+ 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
+ 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
+ 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
+ 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
+ {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
+ 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
+ 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
+ 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
+ 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
+ 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
+ [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
+ 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
+ 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
+ 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
+ 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
+ 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
+ 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
+ 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
+ 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
+ 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
+ [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
+ 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
+ [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
+ 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
+ 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
+ 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
+ [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
+ 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
+ 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
+ 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
+ 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
+ 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
+ [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
+ 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
+ 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
+ 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
+ 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
+ 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
+ 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
+ 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
+ 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
+ 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
+ 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
+ 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
+ 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
+ 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
+ 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
+ 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
+ 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
+ {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
+ 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
+ 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
+ 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
+ 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
+ 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
+ [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
+ 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
+ [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
+ 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
+ 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
+ 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
+ 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
+ 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
+ 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
+ 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
+ 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
+ [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
+ [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
+ 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
+ [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
+ 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
+ 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
+ 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
+ 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
+ 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
+ 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
+ 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
+ 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
+ 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
+ [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
+ 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
+ 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
+ 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
+ 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
+ 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
+ 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
+ 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
+ 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
+ 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
+ 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
+ [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
+ 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
+ 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
+ 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
+ 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
+ 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
+ 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
+ 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
+ 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
+ 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
+ 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
+ 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
+ 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
+ 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
+ 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
+ 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
+ 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
+ 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
+ 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
+ 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
+ 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
+ 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
+ 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
+ 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
+ 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
+ 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
+ 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
+ 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
+ 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
+ [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
+ 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
+ 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
+ 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
+ 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
+ {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
+ 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
+ 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
+ [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
+ 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
+ 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
+ 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
+ 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
+ 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
+ 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
+ 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
+ [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
+ 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
+ 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
+ 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
+ [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
+ 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
+ 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
+ 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
+ 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
+ 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
+ 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
+ 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
+ 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
+ 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
+ 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
+ [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
+ 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
+ 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
+ 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
+ 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
+ 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
+ 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
+ [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
+ 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
+ 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
+ [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
+ 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
+ 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
+ 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
+ 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
+ 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
+ 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
+ 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
+ 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
+ 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
+ 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
+ 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
+ [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
+ 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
+ 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
+ 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
+ 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
+ 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
+ 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
+ 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
+ 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
+ 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
+ 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
+ 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
+ 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
+ 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
+ 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
+ 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
+ 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
+ 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
+ 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
+ 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
+ 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
+ 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
+ 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
+ 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
+ [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
+ 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
+ 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
+ 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
+ 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
+ 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
+ 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
+ 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
+ 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
+ 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
+ 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
+ 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
+ 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
+ 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
+ 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
+ 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
+ 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
+ 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
+ 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
+ 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
+ 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
+ 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
+ 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
+ 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
+ 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
+ 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
+ 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
+ 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
+ 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
+ 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
+ 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
+ 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
+ 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
+ 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
+ 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
+ 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
+ [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
+ 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
+ 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
+ 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
+ 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
+ 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
+ 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
+ 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
+ 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
+ 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
+ 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
+ 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
+ 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
+ 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
+ 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
+ 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
+ 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
+ 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
+ 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
+ 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
+ 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
+ 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
+ [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
+ 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
+ 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
+ [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
+ 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
+ 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
+ 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
+ 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
+ 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
+ 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
+ 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
+ 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
+ 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
+ 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
+ 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
+ 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
+ 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
+ [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
+ [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
+ 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
+ [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
+ 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
+ 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
+ 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
+ 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
+ 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
+ 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
+ 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
+ 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
+ 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
+ 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
+ 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
+ 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
+ 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
+ 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
+ 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
+ {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
+ 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
+ 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
+ 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
+ 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
+ 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
+ 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
+ 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
+ [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
+ 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
+ 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
+ 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
+ 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
+ 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
+ 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
+ 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
+ {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
+ {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
+ {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
+ 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
+ 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
+ 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
+ {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
+ {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
+ 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
+ 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
+ {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
+ 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
+ {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
+ 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
+ {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
+ 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
+ {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
+ 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
+ {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
+ {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
+ 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
+ {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
+ {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
+ {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
+ {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
+ {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
+ 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
+ {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
+ {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
+ {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
+ {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
+ 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
+ {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
+ {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
+ {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
+ {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
+ {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
+ {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
+ {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
+ {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
+ {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
+ 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
+ {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
+ {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
+ {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
+ {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
+ {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
+ {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
+ {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
+ {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
+ {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
+ {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
+ {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
+ {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
+ {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
+ {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
+ {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
+ {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
+ {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
+ {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
+ {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
+ {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
+ 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
+ {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
+ {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
+ {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
+ {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
+ {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
+ {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
+ {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
+ {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
+ {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
+ 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
+ {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
+ {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
+ {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
+ 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
+ {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
+ {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
+ {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
+ {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
+ {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
+ {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
+ {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
+ {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
+ {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
+ {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
+ 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
+ {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
+ {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
+ {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
+ 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
+ {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
+ {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
+ {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
+ {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
+ {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
+ {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
+ {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
+ {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
+ {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
+ {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
+ {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
+ {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
+ {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
+ {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
+ {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
+ {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
+ {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
+ {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
+ {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
+ {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
+ {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
+ {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
+ 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
+ {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
+ 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
+ {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
+ {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
+ {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
+ {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
+ {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
+ {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
+ 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
+ {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
+ {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
+ {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
+ {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
+ {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
+ 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
+ {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
+ {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
+ {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
+ {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
+ {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
+ {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
+ 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
+ {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
+ {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
+ {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
+ {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
+ {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
+ {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
+ {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
+ {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
+ {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
+ {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
+ {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
+ {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
+ {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
+ {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
+ {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
+ {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
+ {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
+ {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
+ {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
+ {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
+ {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
+ 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
+ {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
+ {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
+ {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
+ {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
+ {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
+ {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
+ {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
+ {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
+ {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
+ {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
+ {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
+ {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
+ {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
+ {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
+ {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
+ {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
+ {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
+ {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
+ {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
+ {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
+ {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
+ {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
+ {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
+ 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
+ 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
+ {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
+ {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
+ {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
+ {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
+ {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
+ {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
+ {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
+ {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
+ {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
+ 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
+ {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
+ {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
+ {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
+ {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
+ 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
+ {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
+ {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
+ {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
+ {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
+ {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
+ {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
+ {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
+ 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
+ {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
+ {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
+ {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
+ {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
+ {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
+ {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
+ {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
+ {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
+ {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
+ {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
+ {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
+ {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
+ 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
+ {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
+ {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
+ {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
+ {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
+ {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
+ {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
+ {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
+ 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
+ {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
+ {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
+ {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
+ {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
+ {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
+ {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
+ {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
+ {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
+ 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
+ {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
+ {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
+ {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
+ {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
+ {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
+ {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
+ {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
+ {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
+ {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
+ {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
+ 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
+ {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
+ {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
+ {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
+ {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
+ {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
+ {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
+ 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
+ {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
+ {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
+ {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
+ {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
+ {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
+ {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
+ {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
+ {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
+ {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
+ {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
+ {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
+ {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
+ {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
+ 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
+ {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
+ {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
+ {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
+ {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
+ {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
+ 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
+ {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
+ {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
+ {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
+ {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
+ {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
+ {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
+ {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
+ {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
+ {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
+ {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
+ {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
+ 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
+ {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
+ {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
+ {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
+ 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
+ {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
+ {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
+ {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
+ 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
+ {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
+ {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
+ {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
+ {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
+ {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
+ 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
+ {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
+ {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
+ {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
+ {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
+ {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
+ {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
+ {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
+ {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
+ {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
+ {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
+ {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
+ 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
+ {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
+ {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
+ {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
+ {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
+ {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
+ {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
+ {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
+ {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
+ {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
+ {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
+ {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
+ {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
+ {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
+ {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
+ {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
+ 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
+ {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
+ {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
+ {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
+ {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
+ {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
+ {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
+ {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
+ {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
+ {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
+ {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
+ 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
+ {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
+ {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
+ {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
+ {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
+ 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
+ {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
+ {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
+ {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
+ {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
+ {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
+ {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
+ {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
+ 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
+ {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
+ {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
+ {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
+ 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
+ {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
+ {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
+ {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
+ {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
+ {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
+ {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
+ {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
+ {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
+ {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
+ {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
+ {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
+ 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
+ {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
+ {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
+ 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
+ {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
+ {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
+ {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
+ {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
+ 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
+ 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
+ {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
+ {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
+ {f: 6, c: 55198}],
+ 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
+ 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
+ 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
+ {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
+ {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
+ {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
+ {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
+ {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
+ 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
+ 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
+ {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
+ 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
+ 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
+ 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
+ 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
+ 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
+ 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
+ {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
+ [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
+ [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
+ 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
+ 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
+ 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
+ {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
+ {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+ {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
+ [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
+ [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
+ [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
+ [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
+ [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
+ [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
+ [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
+ [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
+ [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
+ [12057, 21353, 63192], [12059, 21430, 63193],
+ [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
+ [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
+ [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
+ [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
+ [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
+ 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
+ [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
+ [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
+ [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
+ 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
+ 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
+ [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
+ [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
+ [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
+ [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
+ [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
+ 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
+ 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
+ {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
+ 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
+ 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
+ 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
+ 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
+ [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
+ [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
+ [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
+ [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
+ [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
+ [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
+ [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
+ 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
+ {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
+ {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
+ 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
+ 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
+ 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
+ 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
+ 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
+ {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
+ {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
+ 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
+ [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
+ [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
+ [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
+ [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
+ [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
+ 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
+ {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
+ 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
+ {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
+ {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
+ 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
+ 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
+ {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
+ {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
+ 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
+ {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
+ {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
+ 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
+ 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
+ [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
+ [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
+ [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
+ {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
+ [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
+ [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
+ [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
+ 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
+ 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
+ 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
+ {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
+ {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
+ 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
+ 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
+ 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
+ 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
+ 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
+ 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
+ {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
+ 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
+ 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
+ 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
+ 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
+ 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
+ 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
+ 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
+ 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
+ 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
+ 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
+ {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
+ 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
+ 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
+ [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
+ [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
+ [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
+ 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
+ [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
+ 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
+ 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
+ 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
+ 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
+ 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
+ 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
+ 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
+ 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
+ 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
+ {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
+ 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
+ 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
+ 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
+ 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
+ {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
+ 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
+ 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
+ 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
+ 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
+ [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
+ {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
+ 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
+ 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
+ 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
+ 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
+ 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
+ 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
+ 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
+ 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
+ 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
+ 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
+ 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
+ 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
+ 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
+ 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
+ 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
+ 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
+ [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
+ 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
+ [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
+ 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
+ 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
+ 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
+ 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
+ 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
+ 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
+ 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
+ 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
+ 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
+ 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
+ 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
+ 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
+ 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
+ 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
+ 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
+ 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
+ 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
+ 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
+ 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
+ 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
+ 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
+ {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
+ 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
+ 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
+ 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
+ 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
+ {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
+ 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
+ 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
+ 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
+ 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
+ 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
+ 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
+ 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
+ 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
+ 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
+ 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
+ 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
+ {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
+ [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
+ [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
+ 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
+ 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
+ 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
+ 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
+ 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
+ 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
+ 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
+ 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
+ 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
+ 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
+ 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
+ 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
+ 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
+ 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
+ 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
+ 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
+ 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
+ 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
+ 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
+ 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
+ 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
+ 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
+ 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
+ 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
+ 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
+ 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
+ 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
+ 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
+ {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
+ 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
+ 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
+ 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
+ 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
+ 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
+ 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
+ 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
+ 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
+ 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
+ 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
+ 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
+ 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
+ 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
+ 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
+ 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
+ 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
+ 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
+ [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
+ [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
+ 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
+ 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
+ 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
+ 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
+ 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
+ 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
+ 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
+ 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
+ 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
+ {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
+ 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
+ {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
+ 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
+ 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
+ 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
+ {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
+ 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
+ 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
+ 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
+ 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
+ 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
+ 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
+ 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
+ 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
+ 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
+ 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
+ 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
+ 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
+ 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
+ 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
+ {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
+ 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
+ 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
+ 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
+ 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
+ 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
+ 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
+ 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
+ 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
+ {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
+ 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
+ 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
+ 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
+ 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
+ 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
+ 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
+ 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
+ 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
+ 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
+ [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
+ 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
+ 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
+ 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
+ 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
+ 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
+ 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
+ [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
+ 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
+ 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
+ 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
+ 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
+ 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
+ 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
+ {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
+ 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
+ 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
+ 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
+ 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
+ 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
+ {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
+ 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
+ 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
+ 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
+ {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
+ 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
+ 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
+ {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
+ 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
+ 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
+ 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
+ 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
+ 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
+ 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
+ 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
+ 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
+ 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
+ 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
+ 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
+ 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
+ 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
+ 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
+ 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
+ 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
+ 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
+ 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
+ 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
+ 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
+ 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
+ [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
+ {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
+ 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
+ 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
+ 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
+ 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
+ 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
+ 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
+ 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
+ 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
+ {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
+ 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
+ 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
+ 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
+ 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
+ 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
+ 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
+ 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
+ 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
+ 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
+ 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
+ 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
+ {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
+ 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
+ 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
+ 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
+ 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
+ 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
+ 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
+ {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
+ 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
+ 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
+ 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
+ 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
+ {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
+ 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
+ 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
+ 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
+ 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
+ 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
+ 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
+ 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
+ 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
+ {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
+ {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
+ {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
+ [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
+ 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
+ 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
+ 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
+ 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
+ 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
+ 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
+ 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
+ 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
+ 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
+ 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
+ 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
+ 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
+ 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
+ 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
+ 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
+ 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
+ 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
+ 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
+ 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
+ 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
+ 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
+ [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
+ {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
+ 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
+ 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
+ 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
+ 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
+ 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
+ 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
+ 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
+ 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
+ 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
+ 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
+ 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
+ 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
+ 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
+ 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
+ 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
+ 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
+ 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
+ {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
+ 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
+ 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
+ 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
+ {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
+ 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
+ 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
+ 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
+ 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
+ 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
+ {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
+ 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
+ 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
+ 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
+ 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
+ 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
+ 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
+ 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
+ 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
+ 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
+ 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
+ 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
+ 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
+ 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
+ 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
+ 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
+ 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
+ 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
+ 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
+ {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
+ 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
+ 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
+ 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
+ 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
+ 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
+ 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
+ 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
+ {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
+ 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
+ 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
+ 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
+ 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
+ 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
+ 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
+ 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
+ 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
+ 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
+ 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
+ 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
+ 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
+ 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
+ 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
+ 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
+ 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
+ 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
+ {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
+ {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
+ 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
+ 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
+ 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
+ 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
+ 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
+ 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
+ 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
+ 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
+ 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
+ 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
+ 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
+ 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
+ [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
+ 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
+ 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
+ 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
+ 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
+ {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
+ 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
+ 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
+ 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
+ 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
+ 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
+ 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
+ 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
+ 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
+ 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
+ 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
+ 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
+ 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
+ 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
+ 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
+ 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
+ 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
+ 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
+ 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
+ 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
+ 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
+ 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
+ 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
+ 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
+ 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
+ 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
+ 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
+ {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
+ 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
+ {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
+ 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
+ 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
+ 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
+ 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
+ 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
+ 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
+ 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
+ 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
+ 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
+ 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
+ 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
+ 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
+ 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
+ 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
+ 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
+ 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
+ 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
+ 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
+ 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
+ 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
+ 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
+ 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
+ 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
+ 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
+ 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
+ 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
+ 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
+ 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
+ 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
+ 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
+ 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
+ {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
+ 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
+ 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
+ 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
+ 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
+ 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
+ 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
+ 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
+ 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
+ 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
+ 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
+ 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
+ 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
+ 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
+ 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
+ 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
+ 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
+ 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
+ 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
+ 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
+ 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
+ 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
+ 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
+ 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
+ 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
+ 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
+ {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
+ 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
+ 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
+ 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
+ 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
+ [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
+ [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
+ 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
+ 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
+ [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
+ 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
+ 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
+ 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
+ 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
+ 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
+ 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
+ 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
+ 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
+ [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
+ 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
+ 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
+ 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
+ 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
+ [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
+ 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
+ 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
+ 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
+ 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
+ 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
+ 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
+ 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
+ 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
+ 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
+ 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
+ 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
+ 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
+ {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
+ 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
+ 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
+ {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
+ 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
+ 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
+ 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
+ {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
+ 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
+ [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
+ 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
+ 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
+ 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
+ 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
+ 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
+ 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
+ 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
+ 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
+ {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
+ 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
+ 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
+ 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
+ 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
+ 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
+ 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
+ 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
+ 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
+ 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
+ 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
+ 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
+ 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
+ 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
+ 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
+ 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
+ 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
+ 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
+ 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
+ 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
+ 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
+ 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
+ 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
+ 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
+ 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
+ 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
+ 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
+ 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
+ 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
+ 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
+ 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
+ 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
+ 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
+ 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
+ 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
+ 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
+ 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
+ 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
+ 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
+ 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
+ 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
+ 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
+ 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
+ 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
+ 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
+ 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
+ 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
+ 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
+ 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
+ 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
+ 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
+ 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
+ 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
+ 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
+ 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
+ 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
+ {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
+ 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
+ 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
+ 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
+ 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
+ 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
+ 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
+ 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
+ {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
+ {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
+ 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
+ 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
+ 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
+ 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
+ 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
+ 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
+ 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
+ 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
+ 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
+ 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
+ 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
+ {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
+ 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
+ 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
+ {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
+ 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
+ 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
+ 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
+ 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
+ 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
+ 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
+ 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
+ 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
+ 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
+ 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
+ {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
+ 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
+ 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
+ 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
+ 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
+ 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
+ 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
+ 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
+ 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
+ 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
+ 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
+ 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
+ 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
+ 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
+ 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
+ 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
+ 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
+ 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
+ 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
+ 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
+ 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
+ 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
+ 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
+ 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
+ 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
+ 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
+ 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
+ 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
+ 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
+ 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
+ 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
+ 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
+ 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
+ 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
+ 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
+ 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
+ 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
+ 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
+ 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
+ {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
+ 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
+ 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
+ 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
+ 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
+ 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
+ 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
+ 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
+ [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
+ 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
+ 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
+ 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
+ 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
+ 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
+ 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
+ {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
+ 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
+ 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
+ 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
+ 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
+ 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
+ {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
+ 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
+ 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
+ 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
+ {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
+ 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
+ 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
+ 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
+ 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
+ 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
+ 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
+ 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
+ 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
+ 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
+ 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
+ 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
+ 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
+ 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
+ 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
+ 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
+ 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
+ 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
+ {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
+ 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
+ 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
+ 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
+ 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
+ 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
+ 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
+ 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
+ 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
+ {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
+ 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
+ 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
+ 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
+ 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
+ {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
+ 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
+ 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
+ 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
+ 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
+ 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
+ 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
+ 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
+ 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
+ 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
+ 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
+ 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
+ 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
+ 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
+ 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
+ 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
+ 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
+ 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
+ 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
+ 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
+ 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
+ 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
+ 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
+ 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
+ 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
+ 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
+ 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
+ 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
+ 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
+ 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
+ {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
+ 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
+ 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
+ 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
+ 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
+ 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
+ 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
+ {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
+ 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
+ {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
+ 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
+ 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
+ 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
+ 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
+ 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
+ {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
+ 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
+ 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
+ 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
+ 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
+ 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
+ {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
+ 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
+ {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
+ [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
+ 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
+ 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
+ [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
+ 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
+ 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
+ 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
+ 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
+ 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
+ {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
+ {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
+ 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
+ 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
+ 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
+ {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
+ 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
+ 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
+ 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
+ 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
+ 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
+ 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
+ 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
+ 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
+ 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
+ {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
+ [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
+ 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
+ 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
+ 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
+ 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
+ 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
+ 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
+ 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
+ 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
+ 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
+ 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
+ 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
+ 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
+ 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
+ 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
+ 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
+ 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
+ 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
+ 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
+ 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
+ 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
+ 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
+ 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
+ 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
+ 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
+ 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
+ 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
+ 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
+ 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
+ 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
+ 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
+ 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
+ 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
+ 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
+ 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
+ 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
+ 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
+ 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
+ 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
+ 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
+ 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
+ {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
+ 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
+ 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
+ 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
+ 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
+ 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
+ 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
+ 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
+ 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
+ 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
+ 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
+ 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
+ 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
+ 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
+ {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
+ 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
+ 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
+ {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
+ 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
+ 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
+ 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
+ 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
+ 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
+ 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
+ {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
+ 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
+ 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
+ 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
+ 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
+ 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
+ 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
+ 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
+ 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
+ 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
+ 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
+ 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
+ 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
+ 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
+ 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
+ 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
+ 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
+ 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
+ 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
+ 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
+ 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
+ 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
+ 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
+ {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
+ 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
+ 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
+ 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
+ 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
+ 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
+ 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
+ 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
+ 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
+ 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
+ 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
+ {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
+ 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
+ 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
+ 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
+ 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
+ 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
+ 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
+ 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
+ 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
+ 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
+ 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
+ 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
+ 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
+ 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
+ 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
+ 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
+ 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
+ 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
+ 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
+ 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
+ {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
+ 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
+ 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
+ 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
+ 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
+ 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
+ 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
+ {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
+ 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
+ {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
+ 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
+ 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
+ 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
+ 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
+ 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
+ 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
+ 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
+ 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
+ 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
+ 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
+ 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
+ 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
+ {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
+ 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
+ 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
+ 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
+ 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
+ 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
+ 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
+ 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
+ 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
+ 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
+ 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
+ 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
+ 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
+ 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
+ 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
+ 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
+ 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
+ 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
+ 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
+ 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
+ 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
+ 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
+ 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
+ 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
+ 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
+ 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
+ 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
+ {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
+ 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
+ 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
+ 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
+ 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
+ {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
+ 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
+ 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
+ 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
+ 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
+ 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
+ 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
+ {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
+ {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
+ {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
+ 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
+ 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
+ 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
+ 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
+ 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
+ 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
+ {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
+ 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
+ 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
+ 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
+ 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
+ {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
+ 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
+ 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
+ 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
+ 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
+ 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
+ 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
+ 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
+ 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
+ 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
+ {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
+ 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
+ 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
+ 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
+ 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
+ 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
+ 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
+ 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
+ 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
+ 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
+ {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
+ 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
+ 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
+ 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
+ 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
+ {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
+ 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
+ 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
+ {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
+ 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
+ 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
+ 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
+ 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
+ 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
+ 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
+ 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
+ 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
+ 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
+ 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
+ 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
+ {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
+ 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
+ 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
+ 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
+ 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
+ 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
+ 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
+ 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
+ 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
+ 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
+ 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
+ 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
+ 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
+ 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
+ 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
+ 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
+ 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
+ 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
+ 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
+ {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
+ 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
+ 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
+ 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
+ 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
+ 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
+ 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
+ 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
+ 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
+ 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
+ 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
+ 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
+ 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
+ {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
+ 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
+ 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
+ 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
+ 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
+ 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
+ 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
+ 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
+ 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
+ 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
+ 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
+ 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
+ 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
+ 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
+ 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
+ {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
+ 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
+ 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
+ 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
+ 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
+ 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
+ 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
+ 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
+ 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
+ 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
+ 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
+ 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
+ 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
+ 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
+ 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
+ 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
+ {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
+ 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
+ [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
+ 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
+ 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
+ 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
+ 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
+ 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
+ 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
+ [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
+ 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
+ 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
+ {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
+ 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
+ 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
+ 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
+ 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
+ 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
+ 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
+ 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
+ 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
+ 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
+ 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
+ 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
+ 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
+ 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
+ {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
+ 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
+ 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
+ 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
+ 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
+ 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
+ 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
+ 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
+ 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
+ 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
+ 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
+ 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
+ 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
+ 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
+ {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
+ {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
+ 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
+ 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
+ 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
+ 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
+ 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
+ {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
+ 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
+ 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
+ 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
+ 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
+ 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
+ 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
+ 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
+ {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
+ 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
+ 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
+ {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
+ 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
+ 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
+ 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
+ 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
+ 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
+ {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
+ 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
+ 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
+ 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
+ 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
+ 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
+ {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
+ 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
+ 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
+ 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
+ {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
+ {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
+ {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
+ 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
+ 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
+ {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
+ 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
+ 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
+ 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
+ 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
+ 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
+ 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
+ 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
+ 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
+ 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
+ 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
+ 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
+ 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
+ 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
+ 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
+ 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
+ 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
+ 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
+ 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
+ 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
+ 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
+ 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
+ {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
+ 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
+ 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
+ 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
+ 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
+ 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
+ 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
+ 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
+ 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
+ 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
+ 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
+ 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
+ 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
+ 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
+ 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
+ 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
+ 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
+ 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
+ {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
+ 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
+ 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
+ {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
+ 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
+ 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
+ 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
+ {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
+ 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
+ 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
+ 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
+ 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
+ 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
+ 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
+ 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
+ {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
+ 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
+ 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
+ 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
+ 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
+ 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
+ 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
+ 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
+ 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
+ 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
+ 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
+ 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
+ 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
+ {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
+ 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
+ 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
+ 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
+ {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
+ 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
+ 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
+ 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
+ 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
+ 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
+ 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
+ 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
+ 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
+ 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
+ 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
+ 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
+ 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
+ {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
+ 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
+ [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
+ [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
+ [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
+ [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
+ [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
+ [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
+ [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
+ [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
+ [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
+ [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
+ [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
+ [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
+ [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
+ [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
+ [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
+ [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
+ [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
+ [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
+ [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
+ [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
+ [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
+ [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
+ [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
+ [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
+ [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
+ [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
+ [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
+ [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
+ [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
+ [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
+ [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
+ [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
+ [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
+ [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
+ [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
+ [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
+ [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
+ [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
+ [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
+ [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
+ [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
+ [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
+ [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
+ [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
+ [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
+ [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
+ [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
+ [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
+ [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
+ [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
+ [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
+ [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
+ [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
+ [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
+ [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
+ [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
+ [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
+ [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
+ [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
+ [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
+ [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
+ {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
+ [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
+ [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
+ 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
+ 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
+ {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
+ [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
+ [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
+ [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
+ [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
+ [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
+ [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
+ [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
+ [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
+ [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
+ [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
+ [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
+ [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
+ [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
+ [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
+ [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
+ [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
+ [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
+ [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
+ [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
+ [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
+ [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
+ [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
+ [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
+ [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
+ [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
+ [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
+ [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
+ [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
+ [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
+ [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
+ [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
+ [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
+ [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
+ [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
+ [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
+ [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
+ [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
+ [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
+ [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
+ [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
+ [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
+ [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
+ [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
+ [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
+ [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
+ [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
+ [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
+ [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
+ [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
+ [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
+ [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
+ [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
+ [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
+ [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
+ [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
+ [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
+ [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
+ [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
+ [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
+ [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
+ [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
+ [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
+ [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
+ [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
+ [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
+ [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
+ [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
+ [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
+ [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
+ [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
+ [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
+ [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
+ [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
+ [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
+ [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
+ [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
+ [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
+ [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
+ [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
+ [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
+ [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
+ [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
+ [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
+ [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
+ [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
+ [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
+ [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
+ [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
+ [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
+ [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
+ [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
+ [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
+ [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
+ [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
+ [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
+ [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
+ [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
+ [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
+ [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
+ [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
+ [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
+ [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
+ [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
+ [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
+ [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
+ [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
+ [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
+ [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
+ [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
+ [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
+ [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
+ [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
+ [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
+ [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
+ [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
+ [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
+ [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
+ [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
+ [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
+ [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
+ [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
+ [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
+ [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
+ [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
+ [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
+ [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
+ [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
+ [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
+ [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
+ [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
+ [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
+ [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
+ [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
+ [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
+ [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
+ [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
+ [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
+ [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
+ [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
+ [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
+ [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
+ [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
+ [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
+ [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
+ [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
+ [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
+ [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
+ [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
+ [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
+ [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
+ [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
+ [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
+ [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
+ [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
+ [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
+ [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
+ [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
+ [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
+ [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
+ [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
+ [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
+ [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
+ [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
+ [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
+ [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
+ [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
+ [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
+ [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
+ [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
+ [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
+ [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
+ [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
+ [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
+ [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
+ [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
+ [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
+ [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
+ [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
+ [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
+ [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
+ [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
+ [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
+ [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
+ [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
+ [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
+ [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
+ [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
+ [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
+ [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
+ [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
+ [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
+ [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
+ [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
+ [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
+ [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
+ [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
+ [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
+ [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
+ [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
+ [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
+ [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
+ [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
+ [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
+ [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
+ [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
+ [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
+ [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
+ [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
+ [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
+ [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
+ [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
+ [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
+ [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
+ [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
+ [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
+ [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
+ [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
+ [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
+ [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
+ [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
+ [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
+ [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
+ [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
+ [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
+ [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
+ [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
+ [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
+ [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
+ [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
+ [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
+ [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
+ [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
+ [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
+ [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
+ [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
+ [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
+ [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
+ [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
+ [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
+ [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
+ [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
+ [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
+ [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
+ [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
+ [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
+ [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
+ [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
+ [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
+ [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
+ [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
+ [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
+ [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
+ [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
+ [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
+ [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
+ [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
+ [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
+ [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
+ [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
+ [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
+ [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
+ [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
+ [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
+ [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
+ [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
+ [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
+ [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
+ [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
+ [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
+ [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
+ [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
+ [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
+ [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
+ [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
+ [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
+ [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
+ [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
+ [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
+ [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
+ [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
+ [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
+ [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
+ [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
+ [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
+ [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
+ [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
+ [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
+ [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
+ [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
+ [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
+ [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
+ [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
+ [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
+ [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
+ [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
+ [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
+ [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
+ [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
+ [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
+ [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
+ [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
+ [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
+ [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
+ [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
+ [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
+ [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
+ [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
+ [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
+ [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
+ [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
+ [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
+ [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
+ [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
+ [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
+ [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
+ [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
+ [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
+ [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
+ [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
+ [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
+ [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
+ [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
+ [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
+ [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
+ [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
+ [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
+ [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
+ [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
+ [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
+ [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
+ [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
+ [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
+ [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
+ [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
+ [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
+ [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
+ [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
+ [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
+ [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
+ [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
+ [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
+ [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
+ [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
+ [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
+ [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
+ [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
+ [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
+ [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
+ [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
+ [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
+ [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
+ [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
+ [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
+ [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
+ [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
+ [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
+ [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
+ [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
+ [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
+ [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
+ [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
+ [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
+ [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
+ [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
+ [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
+ [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
+ [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
+ [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
+ [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
+ [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
+ [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
+ [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
+ [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
+ [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
+ [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
+ [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
+ [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
+ [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
+ [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
+ [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
+ [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
+ [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
+ [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
+ [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
+ [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
+ [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
+ [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
+ [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
+ [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
+ [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
+ [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
+ [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
+ [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
+ [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
+ [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
+ [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
+ [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
+ [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
+ [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
+ [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
+ [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
+ [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
+ [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
+ [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
+ [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
+ [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
+ [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
+ [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
+ [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
+ [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
+ [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
+ [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
+ [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
+ [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
+ [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
+ [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
+ [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
+ [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
+ [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
+ [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
+ [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
+ [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
+ [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
+ [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
+ [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
+ [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
+ [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
+ [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
+ [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
+ [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
+ [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
+ [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
+ [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
+ [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
+ [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
+ [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
+ [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
+ [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
+ [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
+ [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
+ [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
+ [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
+ [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
+ [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
+ [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
+ [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
+ [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
+ [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
+ [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
+ [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
+ [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
+ [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
+ [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
+ [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
+ [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
+ [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
+ [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
+ [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
+ [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
+ [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
+ [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
+ [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
+ [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
+ [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
+ [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
+ [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
+ [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
+ [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
+ [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
+ [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
+ [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
+ [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
+ [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
+ [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
+ [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
+ [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
+ [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
+ [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
+ [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
+ [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
+ [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
+ [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
+ [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
+ [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
+ [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
+ [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
+ [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
+ [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
+ [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
+ [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
+ [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
+ [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
+ [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
+ [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
+ [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
+ [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
+ [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
+ [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
+ 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
+ [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
+ [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
+ [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
+ [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
+ [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
+ [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
+ [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
+ [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
+ [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
+ [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
+ 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
+ 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
+ [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
+ [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
+ [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
+ [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
+ [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
+ [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
+ [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
+ [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
+ [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
+ [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
+ [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
+ [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
+ [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
+ [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
+ [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
+ [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
+ [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
+ [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
+ [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
+ [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
+ [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
+ [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
+ [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
+ [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
+ [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
+ [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
+ [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
+ [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
+ [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
+ [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
+ [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
+ [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
+ [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
+ [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
+ [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
+ [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
+ [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
+ [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
+ [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
+ [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
+ [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
+ [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
+ [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
+ [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
+ [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
+ [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
+ [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
+ [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
+ [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
+ [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
+ [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
+ [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
+ [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
+ [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
+ [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
+ [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
+ [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
+ [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
+ [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
+ [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
+ [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
+ [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
+ [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
+ [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
+ [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
+ [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
+ [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
+ [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
+ [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
+ [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
+ [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
+ [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
+ [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
+ [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
+ [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
+ [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
+ [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
+ [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
+ [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
+ [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
+ [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
+ [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
+ [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
+ [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
+ [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
+ [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
+ [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
+ [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
+ [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
+ [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
+ [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
+ [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
+ [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
+ [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
+ [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
+ [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
+ [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
+ [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
+ [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
+ [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
+ [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
+ [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
+ [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
+ [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
+ [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
+ [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
+ [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
+ [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
+ [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
+ [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
+ [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
+ [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
+ [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
+ [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
+ [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
+ [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
+ [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
+ [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
+ [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
+ [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
+ [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
+ [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
+ [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
+ [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
+ [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
+ [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
+ [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
+ [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
+ [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
+ [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
+ [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
+ [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
+ [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
+ [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
+ [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
+ [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
+ [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
+ [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
+ [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
+ [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
+ [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
+ [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
+ [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
+ [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
+ [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
+ [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
+ [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
+ [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
+ [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
+ [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
+ [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
+ [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
+ [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
+ [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
+ [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
+ [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
+ [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
+ [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
+ [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
+ [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
+ [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
+ [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
+ [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
+ [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
+ [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
+ [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
+ [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
+ [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
+ [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
+ [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
+ [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
+ [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
+ [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
+ [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
+ [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
+ [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
+ [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
+ [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
+ [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
+ [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
+ [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
+ [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
+ [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
+ [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
+ [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
+ [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
+ [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
+ [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
+ [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
+ [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
+ [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
+ [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
+ [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
+ [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
+ [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
+ [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
+ [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
+ [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
+ [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
+ [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
+ [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
+ [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
+ [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
+ [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
+ [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
+ [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
+ [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
+ [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
+ [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
+ [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
+ [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
+ [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
+ [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
+ [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
+ [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
+ [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
+ [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
+ [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
+ [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
+ [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
+ [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
+ [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
+ [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
+ [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
+ [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
+ [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
+ [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
+ [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
+ [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
+ [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
+ [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
+ [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
+ [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
+ [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
+ [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
+ [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
+ [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
+ [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
+ [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
+ [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
+ [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
+ [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
+ [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
+ [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
+ [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
+ [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
+ [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
+ [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
+ 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
+ [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
+ [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
+ [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
+ [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
+ [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
+ [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
+ [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
+ [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
+ [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
+ [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
+ [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
+ [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
+ [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
+ [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
+ {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
+ {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
+ {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
+ {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
+ [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
+ [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
+ [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
+ [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
+ [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
+ [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
+ [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
+ [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
+ [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
+ [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
+ [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
+ [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
+ [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
+ [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
+ [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
+ [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
+ [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
+ [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
+ [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
+ [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
+ [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
+ [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
+ [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
+ [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
+ [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
+ [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
+ [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
+ [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
+ [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
+ [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
+ [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
+ [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
+ [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
+ [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
+ [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
+ [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
+ [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
+ [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
+ [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
+ [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
+ [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
+ [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
+ [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
+ [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
+ [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
+ [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
+ [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
+ [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
+ [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
+ [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
+ [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
+ [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
+ [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
+ [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
+ [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
+ [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
+ [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
+ [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
+ [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
+ [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
+ [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
+ [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
+ [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
+ [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
+ [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
+ [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
+ [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
+ [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
+ [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
+ [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
+ [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
+ [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
+ [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
+ [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
+ [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
+ [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
+ [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
+ [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
+ [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
+ [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
+ [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
+ [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
+ [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
+ [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
+ [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
+ [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
+ [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
+ [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
+ [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
+ [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
+ [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
+ [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
+ [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
+ [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
+ [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
+ [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
+ [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
+ [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
+ [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
+ [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
+ [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
+ [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
+ [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
+ [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
+ [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
+ [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
+ [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
+ [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
+ [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
+ [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
+ [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
+ [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
+ [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
+ [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
+ [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
+ [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
+ [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
+ [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
+ [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
+ [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
+ [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
+ [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
+ [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
+ [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
+ [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
+ [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
+ [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
+ [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
+ [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
+ [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
+ [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
+ [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
+ [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
+ [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
+ [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
+ [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
+ [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
+ [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
+ [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
+ [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
+ [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
+ [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
+ [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
+ [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
+ [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
+ [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
+ [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
+ [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
+ [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
+ [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
+ [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
+ [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
+ [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
+ [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
+ [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
+ [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
+ [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
+ [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
+ [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
+ [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
+ [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
+ [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
+ [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
+ [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
+ [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
+ [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
+ [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
+ [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
+ [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
+ [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
+ [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
+ [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
+ [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
+ [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
+ [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
+ [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
+ [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
+ [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
+ [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
+ [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
+ [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
+ [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
+ [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
+ [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
+ [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
+ [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
+ [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
+ [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
+ [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
+ [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
+ [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
+ [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
+ [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
+ [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
+ [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
+ [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
+ [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
+ [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
+ [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
+ [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
+ [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
+ [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
+ [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
+ [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
+ [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
+ [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
+ [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
+ [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
+ [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
+ [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
+ [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
+ [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
+ [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
+ [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
+ [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
+ [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
+ [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
+ [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
+ [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
+ [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
+ [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
+ [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
+ [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
+ [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
+ [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
+ [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
+ [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
+ [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
+ [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
+ [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
+ [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
+ [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
+ [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
+ [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
+ [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
+ [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
+ [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
+ [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
+ [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
+ [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
+ [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
+ [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
+ [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
+ [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
+ [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
+ [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
+ [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
+ [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
+ [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
+ [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
+ [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
+ [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
+ [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
+ [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
+ [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
+ [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
+ [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
+ [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
+ [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
+ [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
+ [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
+ [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
+ [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
+ [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
+ [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
+ [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
+ [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
+ [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
+ [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
+ [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
+ [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
+ [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
+ [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
+ [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
+ [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
+ [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
+ [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
+ [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
+ [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
+ [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
+ [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
+ [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
+ [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
+ [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
+ [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
+ [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
+ [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
+ [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
+ [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
+ [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
+ [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
+ [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
+ [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
+ [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
+ [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
+ [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
+ [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
+ [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
+ [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
+ [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
+ [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
+ [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
+ [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
+ 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
+ [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
+ [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
+ 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
+ [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
+ 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
+ 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
+ [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
+ [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
+ 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
+ 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
+ [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
+ 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
+ [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
+ 23446, 62959, 32347],
+ 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
+ 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
+ {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
+ {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
+ 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
+ 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
+ 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
+ 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
+ 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
+ {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
+ {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
+ {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+ {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
+ {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
+ {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
+ {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
+ 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
+ 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
+ {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
+ 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
+ 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
+ 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
+ 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
+ [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
+ 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
+ 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
+ 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
+ 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
+ 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
+ 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
+ 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
+ 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
+ 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
+ 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
+ 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
+ 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
+ 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
+ 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
+ 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
+ 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
+ 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
+ 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
+ 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
+ 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
+ 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
+ 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
+ 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
+ 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
+ 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
+ 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
+ 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
+ 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
+ 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
+ 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
+ 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
+ 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
+ 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
+ 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
+ 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
+ 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
+ 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
+ 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
+ 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
+ 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
+ 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
+ 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
+ [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
+ 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
+ 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
+ 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
+ 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
+ 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
+ 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
+ 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
+ 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
+ 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
+ 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
+ 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
+ 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
+ [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
+ 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
+ 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
+ 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
+ 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
+ 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
+ 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
+ [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
+ 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
+ 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
+ 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
+ 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
+ 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
+ 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
+ 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
+ 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
+ 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
+ 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
+ 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
+ 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
+ [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
+ 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
+ [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
+ 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
+ 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
+ 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
+ [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
+ 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
+ [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
+ [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
+ 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
+ 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
+ [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
+ 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
+ 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
+ [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
+ 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
+ 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
+ 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
+ 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
+ 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
+ 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
+ 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
+ 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
+ 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
+ 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
+ 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
+ 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
+ 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
+ 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
+ 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
+ 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
+ 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
+ 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
+ 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
+ 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
+ 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
+ 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
+ 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
+ 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
+ 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
+ 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
+ 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
+ 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
+ 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
+ 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
+ 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
+ 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
+ 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
+ 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
+ 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
+ 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
+ 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
+ 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
+ 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
+ [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
+ 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
+ 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
+ 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
+ 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
+ [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
+ [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
+ 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
+ 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
+ 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
+ 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
+ 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
+ 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
+ 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
+ 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
+ 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
+ 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
+ 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
+ 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
+ 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
+ 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
+ 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
+ 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
+ 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
+ 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
+ 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
+ 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
+ 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
+ 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
+ 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
+ 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
+ [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
+ 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
+ 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
+ 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
+ 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
+ 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
+ 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
+ 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
+ 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
+ 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
+ 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
+ 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
+ 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
+ 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
+ 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
+ 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
+ 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
+ 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
+ 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
+ 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
+ [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
+ 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
+ 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
+ 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
+ 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
+ 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
+ [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
+ 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
+ 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
+ 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
+ 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
+ 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
+ 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
+ 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
+ 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
+ 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
+ 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
+ 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
+ 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
+ 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
+ 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
+ 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
+ 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
+ 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
+ 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
+ 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
+ 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
+ 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
+ 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
+ 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
+ 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
+ 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
+ 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
+ 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
+ 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
+ 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
+ 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
+ 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
+ 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
+ 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
+ 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
+ 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
+ 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
+ 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
+ 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
+ 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
+ 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
+ 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
+ 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
+ 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
+ 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
+ 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
+ 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
+ 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
+ [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
+ [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
+ 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
+ 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
+ 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
+ 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
+ [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
+ 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
+ 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
+ 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
+ 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
+ [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
+ 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
+ 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
+ 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
+ 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
+ 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
+ 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
+ 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
+ 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
+ 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
+ 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
+ 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
+ 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
+ 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
+ [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
+ 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
+ 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
+ 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
+ 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
+ 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
+ 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
+ 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
+ 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
+ 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
+ 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
+ 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
+ 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
+ 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
+ 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
+ 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
+ [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
+ 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
+ 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
+ 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
+ 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
+ [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
+ 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
+ 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
+ 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
+ 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
+ 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
+ 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
+ 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
+ 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
+ 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
+ [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
+ 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
+ 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
+ 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
+ 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
+ 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
+ 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
+ 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
+ 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
+ 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
+ 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
+ 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
+ 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
+ [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
+ 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
+ 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
+ [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
+ 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
+ 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
+ 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
+ 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
+ [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
+ 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
+ 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
+ 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
+ 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
+ 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
+ [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
+ 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
+ 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
+ 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
+ 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
+ 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
+ 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
+ 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
+ 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
+ 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
+ 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
+ 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
+ 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
+ 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
+ [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
+ 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
+ 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
+ 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
+ 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
+ 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
+ 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
+ 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
+ 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
+ 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
+ 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
+ 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
+ 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
+ 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
+ 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
+ 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
+ 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
+ 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
+ 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
+ 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
+ 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
+ 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
+ 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
+ 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
+ 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
+ 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
+ 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
+ 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
+ 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
+ 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
+ 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
+ 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
+ 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
+ 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
+ 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
+ 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
+ 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
+ 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
+ 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
+ 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
+ [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
+ 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
+ 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
+ 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
+ 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
+ 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
+ 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
+ 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
+ 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
+ [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
+ 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
+ [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
+ 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
+ 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
+ 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
+ [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
+ 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
+ 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
+ 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
+ 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
+ {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
+ 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
+ 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
+ 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
+ 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
+ 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
+ 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
+ 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
+ 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
+ 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
+ [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
+ [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
+ 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
+ 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
+ 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
+ {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
+ {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
+ 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
+ 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
+ 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
+ {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
+ 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
+ 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
+ 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
+ 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
+ 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
+ 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
+ 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
+ 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
+ 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
+ {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
+ 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
+ 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
+ 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
+ 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
+ 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
+ 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
+ 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
+ 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
+ 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
+ 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
+ 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
+ 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
+ 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
+ {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
+ 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
+ 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
+ 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
+ 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
+ {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
+ 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
+ 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
+ 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
+ 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
+ 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
+ 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
+ [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
+ [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
+ 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
+ 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
+ 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
+ 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
+ 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
+ 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
+ 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
+ {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
+ 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
+ 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
+ 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
+ {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
+ 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
+ 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
+ {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
+ 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
+ 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
+ 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
+ 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
+ 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
+ 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
+ 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
+ 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
+ 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
+ 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
+ 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
+ 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
+ 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
+ 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
+ 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
+ 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
+ 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
+ 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
+ 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
+ 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
+ [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
+ {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
+ {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
+ 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
+ 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
+ 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
+ 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
+ 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
+ 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
+ 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
+ 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
+ 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
+ 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
+ {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
+ 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
+ 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
+ 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
+ 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
+ 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
+ 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
+ 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
+ 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
+ {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
+ 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
+ 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
+ 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
+ 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
+ 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
+ [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
+ 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
+ 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
+ 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
+ {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
+ 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
+ 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
+ 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
+ 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
+ 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
+ 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
+ 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
+ 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
+ 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
+ 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
+ {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
+ 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
+ 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
+ {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
+ {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
+ 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
+ {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
+ 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
+ [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
+ 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
+ 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
+ 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
+ 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
+ {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
+ 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
+ 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
+ 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
+ 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
+ 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
+ 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
+ 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
+ {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
+ 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
+ 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
+ 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
+ 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
+ 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
+ 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
+ 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
+ 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
+ {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
+ {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
+ 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
+ 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
+ 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
+ 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
+ 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
+ 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
+ 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
+ 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
+ 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
+ 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
+ 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
+ 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
+ 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
+ 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
+ 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
+ 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
+ {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
+ 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
+ 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
+ [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
+ 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
+ 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
+ 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
+ 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
+ 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
+ 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
+ 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
+ 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
+ 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
+ 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
+ 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
+ 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
+ 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
+ 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
+ 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
+ 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
+ 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
+ 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
+ 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
+ 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
+ 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
+ {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
+ 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
+ {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
+ {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
+ 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
+ {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
+ 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
+ {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
+ 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
+ {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
+ {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
+ {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
+ {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
+ 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
+ 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
+ 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
+ {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
+ {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
+ 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
+ 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
+ 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
+ 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
+ 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
+ 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
+ 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
+ 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
+ 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
+ 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
+ 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
+ [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
+ 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
+ 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
+ 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
+ {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
+ 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
+ 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
+ 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
+ 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
+ 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
+ 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
+ {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
+ 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
+ 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
+ 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
+ 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
+ {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
+ 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
+ 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
+ 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
+ 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
+ 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
+ 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
+ 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
+ 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
+ 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
+ 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
+ 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
+ {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
+ 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
+ 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
+ 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
+ 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
+ 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
+ {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
+ 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
+ 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
+ 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
+ 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
+ {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
+ 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
+ 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
+ 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
+ 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
+ {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
+ {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
+ 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
+ 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
+ {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
+ {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
+ {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
+ 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
+ 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
+ {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
+ 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
+ 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
+ {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
+ 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
+ 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
+ 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
+ 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
+ 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
+ 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
+ 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
+ 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
+ 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
+ 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
+ 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
+ [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
+ 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
+ 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
+ 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
+ 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
+ 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
+ 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
+ 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
+ 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
+ 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
+ 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
+ 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
+ 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
+ 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
+ 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
+ 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
+ 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
+ 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
+ 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
+ [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
+ 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
+ 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
+ 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
+ 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
+ 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
+ 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
+ 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
+ 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
+ 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
+ [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
+ 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
+ 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
+ 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
+ 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
+ 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
+ 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
+ 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
+ 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
+ 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
+ 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
+ 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
+ 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
+ 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
+ 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
+ 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
+ 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
+ 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
+ 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
+ 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
+ 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
+ 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
+ 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
+ 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
+ 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
+ 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
+ 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
+ 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
+ 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
+ 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
+ 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
+ [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
+ 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
+ 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
+ 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
+ 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
+ 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
+ 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
+ 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
+ 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
+ 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
+ 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
+ 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
+ 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
+ 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
+ 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
+ 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
+ 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
+ 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
+ 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
+ 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
+ [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
+ 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
+ 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
+ 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
+ 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
+ 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
+ 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
+ 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
+ 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
+ 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
+ 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
+ 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
+ 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
+ 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
+ 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
+ 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
+ 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
+ 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
+ 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
+ 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
+ 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
+ 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
+ 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
+ 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
+ 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
+ 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
+ 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
+ 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
+ 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
+ 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
+ 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
+ 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
+ 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
+ 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
+ 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
+ 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
+ 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
+ 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
+ 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
+ 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
+ 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
+ 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
+ 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
+ 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
+ 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
+ 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
+ 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
+ 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
+ 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
+ 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
+ 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
+ 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
+ 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
+ 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
+ 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
+ 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
+ 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
+ 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
+ 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
+ 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
+ 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
+ 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
+ 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
+ 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
+ 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
+ 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
+ {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
+ 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
+ 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
+ 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
+ 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
+ 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
+ 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
+ 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
+ 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
+ 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
+ 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
+ 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
+ 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
+ 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
+ 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
+ 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
+ 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
+ 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
+ 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
+ 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
+ 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
+ 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
+ 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
+ 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
+ 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
+ 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
+ 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
+ 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
+ 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
+ {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
+ 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
+ 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
+ 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
+ {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
+ 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
+ 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
+ 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
+ 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
+ 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
+ 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
+ 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
+ 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
+ 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
+ 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
+ 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
+ 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
+ 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
+ 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
+ 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
+ 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
+ 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
+ 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
+ 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
+ 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
+ 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
+ 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
+ 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
+ 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
+ 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
+ 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
+ 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
+ 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
+ [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
+ 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
+ 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
+ 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
+ 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
+ {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
+ {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
+ {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
+ 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
+ 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
+ {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
+ 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
+ {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
+ 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
+ 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
+ {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
+ {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
+ 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
+ {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
+ {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
+ 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
+ {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
+ {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
+ 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
+ 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
+ {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
+ 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
+ {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
+ 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
+ {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
+ {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
+ 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
+ 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
+ {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
+ {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
+ {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
+ {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
+ {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
+ {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
+ {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
+ {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
+ {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
+ {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
+ 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
+ {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
+ {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
+ 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
+ {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
+ {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
+ {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
+ 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
+ {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
+ {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
+ {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
+ {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
+ {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
+ {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
+ 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
+ {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
+ {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
+ {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
+ 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
+ {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
+ {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
+ {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
+ {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
+ {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
+ {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
+ {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
+ {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
+ {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
+ 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
+ {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
+ {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
+ {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
+ {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
+ {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
+ 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
+ {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
+ 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
+ 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
+ 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
+ {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
+ {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
+ {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
+ 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
+ {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
+ {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
+ 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
+ {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
+ {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
+ {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
+ {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
+ {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
+ {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
+ {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
+ 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
+ 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
+ {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
+ {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
+ {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
+ {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
+ {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
+ {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
+ 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
+ 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
+ {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
+ {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
+ 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
+ {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
+ {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
+ 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
+ {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
+ {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
+ {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
+ {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
+ {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
+ {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
+ 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
+ {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
+ 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
+ {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
+ {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
+ {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
+ {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
+ {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
+ {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
+ {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
+ {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
+ {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
+ {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
+ {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
+ {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
+ 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
+ {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
+ {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
+ {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
+ {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
+ {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
+ 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
+ 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
+ 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
+ {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
+ {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
+ {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
+ {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
+ 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
+ {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
+ {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
+ {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
+ {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
+ {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
+ {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
+ {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
+ {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
+ 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
+ {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
+ {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
+ {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
+ {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
+ {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
+ {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
+ {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
+ {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
+ {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
+ {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
+ {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
+ {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
+ 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
+ {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
+ 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
+ {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
+ {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
+ 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
+ {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
+ {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
+ {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
+ {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
+ {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
+ 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
+ {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
+ {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
+ {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
+ {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
+ {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
+ {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
+ {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
+ {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
+ 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
+ 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
+ {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
+ 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
+ {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
+ {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
+ {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
+ {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
+ {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
+ 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
+ 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
+ {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
+ 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
+ {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
+ {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
+ {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
+ {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
+ 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
+ {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
+ 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
+ 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
+ {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
+ {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
+ {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
+ {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
+ {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
+ {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
+ {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
+ {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
+ {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
+ {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
+ {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
+ {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
+ {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
+ {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
+ {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
+ {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
+ {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
+ {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
+ {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
+ {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
+ {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
+ {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
+ {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
+ {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
+ {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
+ {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
+ {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
+ {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
+ {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
+ 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
+ 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
+ {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
+ {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
+ {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
+ 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
+ {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
+ {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
+ {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
+ {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
+ {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
+ {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
+ {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
+ {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
+ {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
+ {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
+ {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
+ 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
+ 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
+ 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
+ {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
+ {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
+ {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
+ {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
+ {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
+ {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
+ {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
+ {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
+ {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
+ 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
+ {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
+ 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
+ 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
+ {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
+ {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
+ {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
+ {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
+ {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
+ 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
+ {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
+ {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
+ 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
+ {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
+ {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
+ {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
+ {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
+ {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
+ {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
+ {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
+ {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
+ {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
+ 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
+ {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
+ {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
+ {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
+ {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
+ {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
+ {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
+ {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
+ 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
+ {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
+ {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
+ {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
+ 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
+ {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
+ {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
+ 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
+ {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
+ 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
+ {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
+ 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
+ {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
+ 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
+ {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
+ 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
+ {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
+ {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
+ {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
+ {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
+ 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
+ {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
+ {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
+ {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
+ {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
+ {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
+ {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
+ {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
+ {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
+ {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
+ {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
+ 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
+ {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
+ {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
+ {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
+ {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
+ {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
+ 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
+ {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
+ {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
+ {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
+ {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
+ {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
+ 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
+ {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
+ {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
+ {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
+ {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
+ 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
+ {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
+ {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
+ 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
+ {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
+ 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
+ {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
+ {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
+ {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
+ {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
+ 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
+ {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
+ 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
+ {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
+ {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
+ 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
+ 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
+ {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
+ {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
+ {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
+ {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
+ {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
+ {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
+ {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
+ {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
+ {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
+ 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
+ {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
+ {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
+ 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
+ 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
+ {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
+ {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
+ {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
+ 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
+ {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
+ {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
+ 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
+ {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
+ {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
+ {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
+ {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
+ {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
+ 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
+ {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
+ {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
+ {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
+ {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
+ {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
+ {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
+ {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
+ {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
+ {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
+ {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
+ {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
+ {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
+ {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
+ {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
+ {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
+ {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
+ {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
+ 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
+ {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
+ {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
+ {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
+ {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
+ {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
+ 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
+ {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
+ {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
+ {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
+ 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
+ {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
+ {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
+ 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
+ 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
+ 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
+ {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
+ {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
+ 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
+ {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
+ {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
+ {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
+ 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
+ {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
+ {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
+ {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
+ 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
+ {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
+ {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
+ {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
+ 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
+ {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
+ 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
+ {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
+ {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
+ {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
+ {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
+ {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
+ {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
+ 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
+ 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
+ {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
+ 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
+ {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
+ {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
+ {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
+ 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
+ {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
+ {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
+ {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
+ {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
+ {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
+ {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
+ {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
+ {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
+ {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
+ {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
+ {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
+ {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
+ 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
+ {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
+ {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
+ {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
+ {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
+ 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
+ {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
+ {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
+ {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
+ {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
+ {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
+ {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
+ {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
+ {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
+ {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
+ 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
+ {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
+ {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
+ 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
+ {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
+ {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
+ 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
+ {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
+ {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
+ {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
+ {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
+ 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
+ {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
+ {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
+ {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
+ {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
+ {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
+ {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
+ {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
+ {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
+ {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
+ 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
+ {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
+ {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
+ {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
+ {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
+ {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
+ {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
+ {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
+ {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
+ {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
+ {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
+ {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
+ {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
+ {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
+ {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
+ {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
+ {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
+ 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
+ {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
+ {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
+ 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
+ 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
+ {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
+ 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
+ {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
+ {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
+ 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
+ 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
+ {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
+ {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
+ 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
+ {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
+ {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
+ {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
+ {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
+ {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
+ {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
+ {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
+ 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
+ {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
+ {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
+ {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
+ {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
+ {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
+ 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
+ {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
+ 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
+ {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
+ {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
+ 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
+ {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
+ {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
+ 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
+ {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
+ {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
+ 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
+ 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
+ {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
+ {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
+ 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
+ {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
+ {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
+ {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
+ {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
+ {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
+ {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
+ 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
+ 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
+ {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
+ {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
+ {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
+ {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
+ {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
+ 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
+ {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
+ 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
+ {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
+ 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
+ {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
+ {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
+ {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
+ {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
+ {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
+ {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
+ 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
+ {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
+ {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
+ {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
+ {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
+ {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
+ {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
+ {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
+ {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
+ {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
+ 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
+ {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
+ {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
+ {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
+ 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
+ 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
+ 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
+ {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
+ {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
+ {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
+ {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
+ {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
+ {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
+ {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
+ {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
+ {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
+ {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
+ {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
+ {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
+ {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
+ 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
+ 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
+ {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
+ 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
+ {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
+ 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
+ {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
+ {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
+ {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
+ {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
+ {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
+ {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
+ {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
+ {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
+ {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
+ {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
+ {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
+ {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
+ {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
+ {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
+ 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
+ {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
+ {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
+ {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
+ {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
+ {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
+ {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
+ {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
+ {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
+ {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
+ {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
+ {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
+ {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
+ 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
+ {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
+ {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
+ 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
+ {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
+ {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
+ {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
+ 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
+ {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
+ {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
+ {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
+ 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
+ {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
+ {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
+ {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
+ {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
+ {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
+ {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
+ 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
+ {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
+ {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
+ 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
+ {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
+ {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
+ {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
+ {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
+ {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
+ {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
+ 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
+ {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
+ {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
+ {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
+ {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
+ {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
+ 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
+ {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
+ {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
+ {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
+ {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
+ {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
+ 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
+ {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
+ {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
+ {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
+ {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
+ {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
+ {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
+ {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
+ {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
+ {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
+ {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
+ {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
+ {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
+ {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
+ {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
+ {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
+ {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
+ {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
+ {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
+ {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
+ {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
+ {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
+ 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
+ {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
+ {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
+ {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
+ {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
+ 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
+ {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
+ {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
+ 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
+ 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
+ {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
+ {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
+ {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
+ {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
+ {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
+ 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
+ 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
+ {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
+ {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
+ {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
+ {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
+ {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
+ {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
+ {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
+ {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
+ 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
+ {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
+ {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
+ {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
+ {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
+ {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
+ {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
+ {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
+ 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
+ {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
+ {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
+ {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
+ {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
+ 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
+ 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
+ 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
+ {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
+ {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
+ {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
+ {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
+ {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
+ {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
+ {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
+ {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
+ 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
+ {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
+ {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
+ {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
+ 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
+ {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
+ 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
+ {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
+ {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
+ 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
+ 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
+ {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
+ {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
+ 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
+ {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
+ {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
+ 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
+ {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
+ 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
+ {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
+ {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
+ {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
+ 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
+ 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
+ {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
+ {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
+ {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
+ {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
+ {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
+ {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
+ {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
+ {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
+ 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
+ {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
+ 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
+ {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
+ {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
+ {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
+ {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
+ 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
+ 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
+ {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
+ {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
+ {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
+ {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
+ {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
+ {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
+ {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
+ {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
+ 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
+ {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
+ {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
+ {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
+ {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
+ {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
+ {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
+ 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
+ {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
+ {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
+ {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
+ 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
+ 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
+ {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
+ {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
+ {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
+ {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
+ {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
+ {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
+ {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
+ {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
+ 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
+ {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
+ 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
+ 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
+ {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
+ 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
+ {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
+ {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
+ {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
+ {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
+ {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
+ 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
+ {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
+ {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
+ {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
+ {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
+ {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
+ {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
+ {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
+ {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
+ {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
+ 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
+ {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
+ {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
+ {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
+ 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
+ {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
+ 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
+ {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
+ {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
+ {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
+ {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
+ {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
+ {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
+ {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
+ {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
+ 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
+ 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
+ {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
+ {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
+ {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
+ {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
+ 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
+ {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
+ {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
+ 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
+ {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
+ {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
+ {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
+ {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
+ {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
+ {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
+ 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
+ {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
+ {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
+ {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
+ {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
+ {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
+ {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
+ {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
+ {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
+ {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
+ 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
+ {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
+ {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
+ {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
+ 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
+ {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
+ {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
+ {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
+ 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
+ {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
+ {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
+ {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
+ {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
+ {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
+ {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
+ {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
+ {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
+ 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
+ {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
+ {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
+ {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
+ {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
+ {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
+ 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
+ {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
+ {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
+ {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
+ 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
+ {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
+ {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
+ {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
+ {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
+ {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
+ {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
+ {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
+ {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
+ [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
+ 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
+ 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
+ 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
+ {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
+ 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
+ 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
+ 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
+ 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
+ {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
+ {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
+ {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
+ {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
+ {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
+ {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
+ {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
+ {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
+ {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
+ {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
+ {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
+ {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
+ {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
+ {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
+ {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
+ {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
+ {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
+ {f: 7, c: 19887}]
+};
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ColorSpace = (function colorSpaceColorSpace() {
+ // Constructor should define this.numComps, this.defaultColor, this.name
+ function constructor() {
+ error('should not call ColorSpace constructor');
+ }
+
+ constructor.prototype = {
+ // Input: array of size numComps representing color component values
+ // Output: array of rgb values, each value ranging from [0.1]
+ getRgb: function colorSpaceGetRgb(color) {
+ error('Should not call ColorSpace.getRgb: ' + color);
+ },
+ // Input: Uint8Array of component values, each value scaled to [0,255]
+ // Output: Uint8Array of rgb values, each value scaled to [0,255]
+ getRgbBuffer: function colorSpaceGetRgbBuffer(input) {
+ error('Should not call ColorSpace.getRgbBuffer: ' + input);
+ }
+ };
+
+ constructor.parse = function colorSpaceParse(cs, xref, res) {
+ var IR = constructor.parseToIR(cs, xref, res);
+ if (IR instanceof AlternateCS)
+ return IR;
+
+ return constructor.fromIR(IR);
+ };
+
+ constructor.fromIR = function colorSpaceFromIR(IR) {
+ var name = isArray(IR) ? IR[0] : IR;
+
+ switch (name) {
+ case 'DeviceGrayCS':
+ return new DeviceGrayCS();
+ case 'DeviceRgbCS':
+ return new DeviceRgbCS();
+ case 'DeviceCmykCS':
+ return new DeviceCmykCS();
+ case 'PatternCS':
+ var basePatternCS = IR[1];
+ if (basePatternCS)
+ basePatternCS = ColorSpace.fromIR(basePatternCS);
+ return new PatternCS(basePatternCS);
+ case 'IndexedCS':
+ var baseIndexedCS = IR[1];
+ var hiVal = IR[2];
+ var lookup = IR[3];
+ return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+ case 'AlternateCS':
+ var numComps = IR[1];
+ var alt = IR[2];
+ var tintFnIR = IR[3];
+
+ return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+ PDFFunction.fromIR(tintFnIR));
+ default:
+ error('Unkown name ' + name);
+ }
+ return null;
+ };
+
+ constructor.parseToIR = function colorSpaceParseToIR(cs, xref, res) {
+ if (isName(cs)) {
+ var colorSpaces = xref.fetchIfRef(res.get('ColorSpace'));
+ if (isDict(colorSpaces)) {
+ var refcs = colorSpaces.get(cs.name);
+ if (refcs)
+ cs = refcs;
+ }
+ }
+
+ cs = xref.fetchIfRef(cs);
+ var mode;
+
+ if (isName(cs)) {
+ mode = cs.name;
+ this.mode = mode;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'Pattern':
+ return ['PatternCS', null];
+ default:
+ error('unrecognized colorspace ' + mode);
+ }
+ } else if (isArray(cs)) {
+ mode = cs[0].name;
+ this.mode = mode;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'CalGray':
+ return 'DeviceGrayCS';
+ case 'CalRGB':
+ return 'DeviceRgbCS';
+ case 'ICCBased':
+ var stream = xref.fetchIfRef(cs[1]);
+ var dict = stream.dict;
+ var numComps = dict.get('N');
+ if (numComps == 1)
+ return 'DeviceGrayCS';
+ if (numComps == 3)
+ return 'DeviceRgbCS';
+ if (numComps == 4)
+ return 'DeviceCmykCS';
+ break;
+ case 'Pattern':
+ var basePatternCS = cs[1];
+ if (basePatternCS)
+ basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+ return ['PatternCS', basePatternCS];
+ case 'Indexed':
+ var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+ var hiVal = cs[2] + 1;
+ var lookup = xref.fetchIfRef(cs[3]);
+ return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+ case 'Separation':
+ case 'DeviceN':
+ var name = cs[1];
+ var numComps = 1;
+ if (isName(name))
+ numComps = 1;
+ else if (isArray(name))
+ numComps = name.length;
+ var alt = ColorSpace.parseToIR(cs[2], xref, res);
+ var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+ return ['AlternateCS', numComps, alt, tintFnIR];
+ case 'Lab':
+ default:
+ error('unimplemented color space object "' + mode + '"');
+ }
+ } else {
+ error('unrecognized color space object: "' + cs + '"');
+ }
+ return null;
+ };
+
+ return constructor;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces. A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function alternateCS() {
+ function constructor(numComps, base, tintFn) {
+ this.name = 'Alternate';
+ this.numComps = numComps;
+ this.defaultColor = [];
+ for (var i = 0; i < numComps; ++i)
+ this.defaultColor.push(1);
+ this.base = base;
+ this.tintFn = tintFn;
+ }
+
+ constructor.prototype = {
+ getRgb: function altcs_getRgb(color) {
+ var tinted = this.tintFn(color);
+ return this.base.getRgb(tinted);
+ },
+ getRgbBuffer: function altcs_getRgbBuffer(input, bits) {
+ var tintFn = this.tintFn;
+ var base = this.base;
+ var scale = 1 / ((1 << bits) - 1);
+ var length = input.length;
+ var pos = 0;
+ var baseNumComps = base.numComps;
+ var baseBuf = new Uint8Array(baseNumComps * length);
+ var numComps = this.numComps;
+ var scaled = new Array(numComps);
+
+ for (var i = 0; i < length; i += numComps) {
+ for (var z = 0; z < numComps; ++z)
+ scaled[z] = input[i + z] * scale;
+
+ var tinted = tintFn(scaled);
+ for (var j = 0; j < baseNumComps; ++j)
+ baseBuf[pos++] = 255 * tinted[j];
+ }
+ return base.getRgbBuffer(baseBuf, 8);
+ }
+ };
+
+ return constructor;
+})();
+
+var PatternCS = (function patternCS() {
+ function constructor(baseCS) {
+ this.name = 'Pattern';
+ this.base = baseCS;
+ }
+ constructor.prototype = {};
+
+ return constructor;
+})();
+
+var IndexedCS = (function indexedCS() {
+ function constructor(base, highVal, lookup) {
+ this.name = 'Indexed';
+ this.numComps = 1;
+ this.defaultColor = [0];
+ this.base = base;
+ this.highVal = highVal;
+
+ var baseNumComps = base.numComps;
+ var length = baseNumComps * highVal;
+ var lookupArray = new Uint8Array(length);
+
+ if (isStream(lookup)) {
+ var bytes = lookup.getBytes(length);
+ lookupArray.set(bytes);
+ } else if (isString(lookup)) {
+ for (var i = 0; i < length; ++i)
+ lookupArray[i] = lookup.charCodeAt(i);
+ } else {
+ error('Unrecognized lookup table: ' + lookup);
+ }
+ this.lookup = lookupArray;
+ }
+
+ constructor.prototype = {
+ getRgb: function indexcs_getRgb(color) {
+ var numComps = this.base.numComps;
+ var start = color[0] * numComps;
+ var c = [];
+
+ for (var i = start, ii = start + numComps; i < ii; ++i)
+ c.push(this.lookup[i]);
+
+ return this.base.getRgb(c);
+ },
+ getRgbBuffer: function indexcs_getRgbBuffer(input) {
+ var base = this.base;
+ var numComps = base.numComps;
+ var lookup = this.lookup;
+ var length = input.length;
+ var baseBuf = new Uint8Array(length * numComps);
+ var baseBufPos = 0;
+
+ for (var i = 0; i < length; ++i) {
+ var lookupPos = input[i] * numComps;
+ for (var j = 0; j < numComps; ++j) {
+ baseBuf[baseBufPos++] = lookup[lookupPos + j];
+ }
+ }
+
+ return base.getRgbBuffer(baseBuf, 8);
+ }
+ };
+ return constructor;
+})();
+
+var DeviceGrayCS = (function deviceGrayCS() {
+ function constructor() {
+ this.name = 'DeviceGray';
+ this.numComps = 1;
+ this.defaultColor = [0];
+ }
+
+ constructor.prototype = {
+ getRgb: function graycs_getRgb(color) {
+ var c = color[0];
+ return [c, c, c];
+ },
+ getRgbBuffer: function graycs_getRgbBuffer(input, bits) {
+ var scale = 255 / ((1 << bits) - 1);
+ var length = input.length;
+ var rgbBuf = new Uint8Array(length * 3);
+ for (var i = 0, j = 0; i < length; ++i) {
+ var c = (scale * input[i]) | 0;
+ rgbBuf[j++] = c;
+ rgbBuf[j++] = c;
+ rgbBuf[j++] = c;
+ }
+ return rgbBuf;
+ }
+ };
+ return constructor;
+})();
+
+var DeviceRgbCS = (function deviceRgbCS() {
+ function constructor() {
+ this.name = 'DeviceRGB';
+ this.numComps = 3;
+ this.defaultColor = [0, 0, 0];
+ }
+ constructor.prototype = {
+ getRgb: function rgbcs_getRgb(color) {
+ return color;
+ },
+ getRgbBuffer: function rgbcs_getRgbBuffer(input, bits) {
+ if (bits == 8)
+ return input;
+ var scale = 255 / ((1 << bits) - 1);
+ var i, length = input.length;
+ var rgbBuf = new Uint8Array(length);
+ for (i = 0; i < length; ++i)
+ rgbBuf[i] = (scale * input[i]) | 0;
+ return rgbBuf;
+ }
+ };
+ return constructor;
+})();
+
+var DeviceCmykCS = (function deviceCmykCS() {
+ function constructor() {
+ this.name = 'DeviceCMYK';
+ this.numComps = 4;
+ this.defaultColor = [0, 0, 0, 1];
+ }
+ constructor.prototype = {
+ getRgb: function cmykcs_getRgb(color) {
+ var c = color[0], m = color[1], y = color[2], k = color[3];
+ var c1 = 1 - c, m1 = 1 - m, y1 = 1 - y, k1 = 1 - k;
+
+ var x, r, g, b;
+ // this is a matrix multiplication, unrolled for performance
+ // code is taken from the poppler implementation
+ x = c1 * m1 * y1 * k1; // 0 0 0 0
+ r = g = b = x;
+ x = c1 * m1 * y1 * k; // 0 0 0 1
+ r += 0.1373 * x;
+ g += 0.1216 * x;
+ b += 0.1255 * x;
+ x = c1 * m1 * y * k1; // 0 0 1 0
+ r += x;
+ g += 0.9490 * x;
+ x = c1 * m1 * y * k; // 0 0 1 1
+ r += 0.1098 * x;
+ g += 0.1020 * x;
+ x = c1 * m * y1 * k1; // 0 1 0 0
+ r += 0.9255 * x;
+ b += 0.5490 * x;
+ x = c1 * m * y1 * k; // 0 1 0 1
+ r += 0.1412 * x;
+ x = c1 * m * y * k1; // 0 1 1 0
+ r += 0.9294 * x;
+ g += 0.1098 * x;
+ b += 0.1412 * x;
+ x = c1 * m * y * k; // 0 1 1 1
+ r += 0.1333 * x;
+ x = c * m1 * y1 * k1; // 1 0 0 0
+ g += 0.6784 * x;
+ b += 0.9373 * x;
+ x = c * m1 * y1 * k; // 1 0 0 1
+ g += 0.0588 * x;
+ b += 0.1412 * x;
+ x = c * m1 * y * k1; // 1 0 1 0
+ g += 0.6510 * x;
+ b += 0.3137 * x;
+ x = c * m1 * y * k; // 1 0 1 1
+ g += 0.0745 * x;
+ x = c * m * y1 * k1; // 1 1 0 0
+ r += 0.1804 * x;
+ g += 0.1922 * x;
+ b += 0.5725 * x;
+ x = c * m * y1 * k; // 1 1 0 1
+ b += 0.0078 * x;
+ x = c * m * y * k1; // 1 1 1 0
+ r += 0.2118 * x;
+ g += 0.2119 * x;
+ b += 0.2235 * x;
+
+ return [r, g, b];
+ },
+ getRgbBuffer: function cmykcs_getRgbBuffer(colorBuf, bits) {
+ var scale = 1 / ((1 << bits) - 1);
+ var length = colorBuf.length / 4;
+ var rgbBuf = new Uint8Array(length * 3);
+ var rgbBufPos = 0;
+ var colorBufPos = 0;
+
+ for (var i = 0; i < length; i++) {
+ var cmyk = [];
+ for (var j = 0; j < 4; ++j)
+ cmyk.push(scale * colorBuf[colorBufPos++]);
+
+ var rgb = this.getRgb(cmyk);
+ for (var j = 0; j < 3; ++j)
+ rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
+ }
+
+ return rgbBuf;
+ }
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ARCFourCipher = (function arcFourCipher() {
+ function constructor(key) {
+ this.a = 0;
+ this.b = 0;
+ var s = new Uint8Array(256);
+ var i, j = 0, tmp, keyLength = key.length;
+ for (i = 0; i < 256; ++i)
+ s[i] = i;
+ for (i = 0; i < 256; ++i) {
+ tmp = s[i];
+ j = (j + tmp + key[i % keyLength]) & 0xFF;
+ s[i] = s[j];
+ s[j] = tmp;
+ }
+ this.s = s;
+ }
+
+ constructor.prototype = {
+ encryptBlock: function arcFourCipherEncryptBlock(data) {
+ var i, n = data.length, tmp, tmp2;
+ var a = this.a, b = this.b, s = this.s;
+ var output = new Uint8Array(n);
+ for (i = 0; i < n; ++i) {
+ a = (a + 1) & 0xFF;
+ tmp = s[a];
+ b = (b + tmp) & 0xFF;
+ tmp2 = s[b];
+ s[a] = tmp2;
+ s[b] = tmp;
+ output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
+ }
+ this.a = a;
+ this.b = b;
+ return output;
+ }
+ };
+ constructor.prototype.decryptBlock = constructor.prototype.encryptBlock;
+
+ return constructor;
+})();
+
+var calculateMD5 = (function calculateMD5() {
+ var r = new Uint8Array([
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+
+ var k = new Int32Array([
+ -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
+ -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
+ 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
+ 643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
+ 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
+ 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
+ -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
+ -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
+ -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
+ -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
+ -145523070, -1120210379, 718787259, -343485551]);
+
+ function hash(data, offset, length) {
+ var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
+ // pre-processing
+ var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
+ var padded = new Uint8Array(paddedLength);
+ var i, j, n;
+ for (i = 0; i < length; ++i)
+ padded[i] = data[offset++];
+ padded[i++] = 0x80;
+ n = paddedLength - 8;
+ while (i < n)
+ padded[i++] = 0;
+ padded[i++] = (length << 3) & 0xFF;
+ padded[i++] = (length >> 5) & 0xFF;
+ padded[i++] = (length >> 13) & 0xFF;
+ padded[i++] = (length >> 21) & 0xFF;
+ padded[i++] = (length >>> 29) & 0xFF;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ // chunking
+ // TODO ArrayBuffer ?
+ var w = new Int32Array(16);
+ for (i = 0; i < paddedLength;) {
+ for (j = 0; j < 16; ++j, i += 4) {
+ w[j] = (padded[i] | (padded[i + 1] << 8) |
+ (padded[i + 2] << 16) | (padded[i + 3] << 24));
+ }
+ var a = h0, b = h1, c = h2, d = h3, f, g;
+ for (j = 0; j < 64; ++j) {
+ if (j < 16) {
+ f = (b & c) | ((~b) & d);
+ g = j;
+ } else if (j < 32) {
+ f = (d & b) | ((~d) & c);
+ g = (5 * j + 1) & 15;
+ } else if (j < 48) {
+ f = b ^ c ^ d;
+ g = (3 * j + 5) & 15;
+ } else {
+ f = c ^ (b | (~d));
+ g = (7 * j) & 15;
+ }
+ var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
+ d = c;
+ c = b;
+ b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
+ a = tmp;
+ }
+ h0 = (h0 + a) | 0;
+ h1 = (h1 + b) | 0;
+ h2 = (h2 + c) | 0;
+ h3 = (h3 + d) | 0;
+ }
+ return new Uint8Array([
+ h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
+ h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
+ h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
+ h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
+ ]);
+ }
+ return hash;
+})();
+
+var NullCipher = (function nullCipher() {
+ function constructor() {
+ }
+
+ constructor.prototype = {
+ decryptBlock: function nullCipherDecryptBlock(data) {
+ return data;
+ }
+ };
+
+ return constructor;
+})();
+
+var AES128Cipher = (function aes128Cipher() {
+ var rcon = new Uint8Array([
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+ 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+ 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+ 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+ 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+ 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+ 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+ 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+ 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+ 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+ 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d]);
+
+ var s = new Uint8Array([
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+ 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+ 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+ 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+ 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+ 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+ 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+ 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+ 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+ 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+ 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+ 0xb0, 0x54, 0xbb, 0x16]);
+
+ var inv_s = new Uint8Array([
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+ 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+ 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+ 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+ 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+ 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+ 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+ 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+ 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+ 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+ 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+ 0x55, 0x21, 0x0c, 0x7d]);
+
+ var mix = new Uint32Array([
+ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+ 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+ 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+ 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+ 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+ 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+ 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+ 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+ 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+ 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+ 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+ 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+ 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+ 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+ 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+ 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+ 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+ 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+ 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+ 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+ 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+ 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+ 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+ 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+ 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+ 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+ 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+ 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+ 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+ 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+ 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+ 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+ 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+ 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+ 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+ 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+ 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+ 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+ 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+ 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+ 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+ 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+ 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+ function expandKey128(cipherKey) {
+ var b = 176, result = new Uint8Array(b);
+ result.set(cipherKey);
+ for (var j = 16, i = 1; j < b; ++i) {
+ // RotWord
+ var t1 = result[j - 3], t2 = result[j - 2],
+ t3 = result[j - 1], t4 = result[j - 4];
+ // SubWord
+ t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
+ // Rcon
+ t1 = t1 ^ rcon[i];
+ for (var n = 0; n < 4; ++n) {
+ result[j] = (t1 ^= result[j - 16]); j++;
+ result[j] = (t2 ^= result[j - 16]); j++;
+ result[j] = (t3 ^= result[j - 16]); j++;
+ result[j] = (t4 ^= result[j - 16]); j++;
+ }
+ }
+ return result;
+ }
+
+ function decrypt128(input, key) {
+ var state = new Uint8Array(16);
+ state.set(input);
+ var i, j, k;
+ var t, u, v;
+ // AddRoundKey
+ for (j = 0, k = 160; j < 16; ++j, ++k)
+ state[j] ^= key[k];
+ for (i = 9; i >= 1; --i) {
+ // InvShiftRows
+ t = state[13]; state[13] = state[9]; state[9] = state[5];
+ state[5] = state[1]; state[1] = t;
+ t = state[14]; u = state[10]; state[14] = state[6];
+ state[10] = state[2]; state[6] = t; state[2] = u;
+ t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+ state[11] = t; state[7] = u; state[3] = v;
+ // InvSubBytes
+ for (j = 0; j < 16; ++j)
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k)
+ state[j] ^= key[k];
+ // InvMixColumns
+ for (j = 0; j < 16; j += 4) {
+ var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+ s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+ t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+ (s3 >>> 24) ^ (s3 << 8));
+ state[j] = (t >>> 24) & 0xFF;
+ state[j + 1] = (t >> 16) & 0xFF;
+ state[j + 2] = (t >> 8) & 0xFF;
+ state[j + 3] = t & 0xFF;
+ }
+ }
+ // InvShiftRows
+ t = state[13]; state[13] = state[9]; state[9] = state[5];
+ state[5] = state[1]; state[1] = t;
+ t = state[14]; u = state[10]; state[14] = state[6];
+ state[10] = state[2]; state[6] = t; state[2] = u;
+ t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+ state[11] = t; state[7] = u; state[3] = v;
+ for (j = 0; j < 16; ++j) {
+ // InvSubBytes
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+ return state;
+ }
+
+ function constructor(key) {
+ this.key = expandKey128(key);
+ this.buffer = new Uint8Array(16);
+ this.bufferPosition = 0;
+ }
+
+ function decryptBlock2(data) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [], iv = this.iv;
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16)
+ continue;
+ // buffer is full, decrypting
+ var plain = decrypt128(buffer, this.key);
+ // xor-ing the IV vector to get plain text
+ for (j = 0; j < 16; ++j)
+ plain[j] ^= iv[j];
+ iv = buffer;
+ result.push(plain);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length == 0)
+ return new Uint8Array([]);
+ if (result.length == 1)
+ return result[0];
+ // combining plain text blocks into one
+ var output = new Uint8Array(16 * result.length);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
+ output.set(result[i], j);
+ return output;
+ }
+
+ constructor.prototype = {
+ decryptBlock: function aes128CipherDecryptBlock(data) {
+ var i, sourceLength = data.length;
+ var buffer = this.buffer, bufferLength = this.bufferPosition;
+ // waiting for IV values -- they are at the start of the stream
+ for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
+ buffer[bufferLength] = data[i];
+ if (bufferLength < 16) {
+ // need more data
+ this.bufferLength = bufferLength;
+ return new Uint8Array([]);
+ }
+ this.iv = buffer;
+ this.buffer = new Uint8Array(16);
+ this.bufferLength = 0;
+ // starting decryption
+ this.decryptBlock = decryptBlock2;
+ return this.decryptBlock(data.subarray(16));
+ }
+ };
+
+ return constructor;
+})();
+
+var CipherTransform = (function cipherTransform() {
+ function constructor(stringCipherConstructor, streamCipherConstructor) {
+ this.stringCipherConstructor = stringCipherConstructor;
+ this.streamCipherConstructor = streamCipherConstructor;
+ }
+ constructor.prototype = {
+ createStream: function cipherTransformCreateStream(stream) {
+ var cipher = new this.streamCipherConstructor();
+ return new DecryptStream(stream,
+ function cipherTransformDecryptStream(data) {
+ return cipher.decryptBlock(data);
+ }
+ );
+ },
+ decryptString: function cipherTransformDecryptString(s) {
+ var cipher = new this.stringCipherConstructor();
+ var data = stringToBytes(s);
+ data = cipher.decryptBlock(data);
+ return bytesToString(data);
+ }
+ };
+ return constructor;
+})();
+
+var CipherTransformFactory = (function cipherTransformFactory() {
+ function prepareKeyData(fileId, password, ownerPassword, userPassword,
+ flags, revision, keyLength, encryptMetadata) {
+ var defaultPasswordBytes = new Uint8Array([
+ 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
+ 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+ 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
+ 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+ var hashData = new Uint8Array(100), i = 0, j, n;
+ if (password) {
+ n = Math.min(32, password.length);
+ for (; i < n; ++i)
+ hashData[i] = password[i];
+ }
+ j = 0;
+ while (i < 32) {
+ hashData[i++] = defaultPasswordBytes[j++];
+ }
+ // as now the padded password in the hashData[0..i]
+ for (j = 0, n = ownerPassword.length; j < n; ++j)
+ hashData[i++] = ownerPassword[j];
+ hashData[i++] = flags & 0xFF;
+ hashData[i++] = (flags >> 8) & 0xFF;
+ hashData[i++] = (flags >> 16) & 0xFF;
+ hashData[i++] = (flags >>> 24) & 0xFF;
+ for (j = 0, n = fileId.length; j < n; ++j)
+ hashData[i++] = fileId[j];
+ if (revision >= 4 && !encryptMetadata) {
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ }
+ var hash = calculateMD5(hashData, 0, i);
+ var keyLengthInBytes = keyLength >> 3;
+ if (revision >= 3) {
+ for (j = 0; j < 50; ++j) {
+ hash = calculateMD5(hash, 0, keyLengthInBytes);
+ }
+ }
+ var encryptionKey = hash.subarray(0, keyLengthInBytes);
+ var cipher, checkData;
+
+ if (revision >= 3) {
+ // padded password in hashData, we can use this array for user
+ // password check
+ i = 32;
+ for (j = 0, n = fileId.length; j < n; ++j)
+ hashData[i++] = fileId[j];
+ cipher = new ARCFourCipher(encryptionKey);
+ var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+ n = encryptionKey.length;
+ var derivedKey = new Uint8Array(n), k;
+ for (j = 1; j <= 19; ++j) {
+ for (k = 0; k < n; ++k)
+ derivedKey[k] = encryptionKey[k] ^ j;
+ cipher = new ARCFourCipher(derivedKey);
+ checkData = cipher.encryptBlock(checkData);
+ }
+ } else {
+ cipher = new ARCFourCipher(encryptionKey);
+ checkData = cipher.encryptBlock(hashData.subarray(0, 32));
+ }
+ for (j = 0, n = checkData.length; j < n; ++j) {
+ if (userPassword[j] != checkData[j])
+ error('incorrect password');
+ }
+ return encryptionKey;
+ }
+
+ var identityName = new Name('Identity');
+
+ function constructor(dict, fileId, password) {
+ var filter = dict.get('Filter');
+ if (!isName(filter) || filter.name != 'Standard')
+ error('unknown encryption method');
+ this.dict = dict;
+ var algorithm = dict.get('V');
+ if (!isInt(algorithm) ||
+ (algorithm != 1 && algorithm != 2 && algorithm != 4))
+ error('unsupported encryption algorithm');
+ this.algorithm = algorithm;
+ var keyLength = dict.get('Length') || 40;
+ if (!isInt(keyLength) ||
+ keyLength < 40 || (keyLength % 8) != 0)
+ error('invalid key length');
+ // prepare keys
+ var ownerPassword = stringToBytes(dict.get('O'));
+ var userPassword = stringToBytes(dict.get('U'));
+ var flags = dict.get('P');
+ var revision = dict.get('R');
+ var encryptMetadata =
+ dict.get('EncryptMetadata') !== false; // makes true as default value
+ var fileIdBytes = stringToBytes(fileId);
+ var passwordBytes;
+ if (password)
+ passwordBytes = stringToBytes(password);
+
+ this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
+ ownerPassword, userPassword,
+ flags, revision,
+ keyLength, encryptMetadata);
+ if (algorithm == 4) {
+ this.cf = dict.get('CF');
+ this.stmf = dict.get('StmF') || identityName;
+ this.strf = dict.get('StrF') || identityName;
+ this.eff = dict.get('EFF') || this.strf;
+ }
+ }
+
+ function buildObjectKey(num, gen, encryptionKey, isAes) {
+ var key = new Uint8Array(encryptionKey.length + 9), i, n;
+ for (i = 0, n = encryptionKey.length; i < n; ++i)
+ key[i] = encryptionKey[i];
+ key[i++] = num & 0xFF;
+ key[i++] = (num >> 8) & 0xFF;
+ key[i++] = (num >> 16) & 0xFF;
+ key[i++] = gen & 0xFF;
+ key[i++] = (gen >> 8) & 0xFF;
+ if (isAes) {
+ key[i++] = 0x73;
+ key[i++] = 0x41;
+ key[i++] = 0x6C;
+ key[i++] = 0x54;
+ }
+ var hash = calculateMD5(key, 0, i);
+ return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+ }
+
+ function buildCipherConstructor(cf, name, num, gen, key) {
+ var cryptFilter = cf.get(name.name);
+ var cfm;
+ if (cryptFilter != null)
+ cfm = cryptFilter.get('CFM');
+ if (!cfm || cfm.name == 'None') {
+ return function cipherTransformFactoryBuildCipherConstructorNone() {
+ return new NullCipher();
+ };
+ }
+ if ('V2' == cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorV2() {
+ return new ARCFourCipher(
+ buildObjectKey(num, gen, key, false));
+ };
+ }
+ if ('AESV2' == cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+ return new AES128Cipher(
+ buildObjectKey(num, gen, key, true));
+ };
+ }
+ error('Unknown crypto method');
+ return null;
+ }
+
+ constructor.prototype = {
+ createCipherTransform: function buildCipherCreateCipherTransform(num,
+ gen) {
+ if (this.algorithm == 4) {
+ return new CipherTransform(
+ buildCipherConstructor(this.cf, this.stmf,
+ num, gen, this.encryptionKey),
+ buildCipherConstructor(this.cf, this.strf,
+ num, gen, this.encryptionKey));
+ }
+ // algorithms 1 and 2
+ var key = buildObjectKey(num, gen, this.encryptionKey, false);
+ var cipherConstructor = function buildCipherCipherConstructor() {
+ return new ARCFourCipher(key);
+ };
+ return new CipherTransform(cipherConstructor, cipherConstructor);
+ }
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PartialEvaluator = (function partialEvaluator() {
+ function constructor(xref, handler, uniquePrefix) {
+ this.state = new EvalState();
+ this.stateStack = [];
+
+ this.xref = xref;
+ this.handler = handler;
+ this.uniquePrefix = uniquePrefix;
+ this.objIdCounter = 0;
+ }
+
+ var OP_MAP = {
+ // Graphics state
+ w: 'setLineWidth',
+ J: 'setLineCap',
+ j: 'setLineJoin',
+ M: 'setMiterLimit',
+ d: 'setDash',
+ ri: 'setRenderingIntent',
+ i: 'setFlatness',
+ gs: 'setGState',
+ q: 'save',
+ Q: 'restore',
+ cm: 'transform',
+
+ // Path
+ m: 'moveTo',
+ l: 'lineTo',
+ c: 'curveTo',
+ v: 'curveTo2',
+ y: 'curveTo3',
+ h: 'closePath',
+ re: 'rectangle',
+ S: 'stroke',
+ s: 'closeStroke',
+ f: 'fill',
+ F: 'fill',
+ 'f*': 'eoFill',
+ B: 'fillStroke',
+ 'B*': 'eoFillStroke',
+ b: 'closeFillStroke',
+ 'b*': 'closeEOFillStroke',
+ n: 'endPath',
+
+ // Clipping
+ W: 'clip',
+ 'W*': 'eoClip',
+
+ // Text
+ BT: 'beginText',
+ ET: 'endText',
+ Tc: 'setCharSpacing',
+ Tw: 'setWordSpacing',
+ Tz: 'setHScale',
+ TL: 'setLeading',
+ Tf: 'setFont',
+ Tr: 'setTextRenderingMode',
+ Ts: 'setTextRise',
+ Td: 'moveText',
+ TD: 'setLeadingMoveText',
+ Tm: 'setTextMatrix',
+ 'T*': 'nextLine',
+ Tj: 'showText',
+ TJ: 'showSpacedText',
+ "'": 'nextLineShowText',
+ '"': 'nextLineSetSpacingShowText',
+
+ // Type3 fonts
+ d0: 'setCharWidth',
+ d1: 'setCharWidthAndBounds',
+
+ // Color
+ CS: 'setStrokeColorSpace',
+ cs: 'setFillColorSpace',
+ SC: 'setStrokeColor',
+ SCN: 'setStrokeColorN',
+ sc: 'setFillColor',
+ scn: 'setFillColorN',
+ G: 'setStrokeGray',
+ g: 'setFillGray',
+ RG: 'setStrokeRGBColor',
+ rg: 'setFillRGBColor',
+ K: 'setStrokeCMYKColor',
+ k: 'setFillCMYKColor',
+
+ // Shading
+ sh: 'shadingFill',
+
+ // Images
+ BI: 'beginInlineImage',
+ ID: 'beginImageData',
+ EI: 'endInlineImage',
+
+ // XObjects
+ Do: 'paintXObject',
+
+ // Marked content
+ MP: 'markPoint',
+ DP: 'markPointProps',
+ BMC: 'beginMarkedContent',
+ BDC: 'beginMarkedContentProps',
+ EMC: 'endMarkedContent',
+
+ // Compatibility
+ BX: 'beginCompat',
+ EX: 'endCompat'
+ };
+
+ constructor.prototype = {
+ getIRQueue: function partialEvaluatorGetIRQueue(stream, resources,
+ queue, dependency) {
+
+ var self = this;
+ var xref = this.xref;
+ var handler = this.handler;
+ var uniquePrefix = this.uniquePrefix;
+
+ function insertDependency(depList) {
+ fnArray.push('dependency');
+ argsArray.push(depList);
+ for (var i = 0, ii = depList.length; i < ii; i++) {
+ var dep = depList[i];
+ if (dependency.indexOf(dep) == -1) {
+ dependency.push(depList[i]);
+ }
+ }
+ }
+
+ function handleSetFont(fontName, fontRef) {
+ var loadedName = null;
+
+ var fontRes = resources.get('Font');
+
+ // TODO: TOASK: Is it possible to get here? If so, what does
+ // args[0].name should be like???
+ assert(fontRes, 'fontRes not available');
+
+ fontRes = xref.fetchIfRef(fontRes);
+ fontRef = fontRef || fontRes.get(fontName);
+ var font = xref.fetchIfRef(fontRef);
+ assertWellFormed(isDict(font));
+ if (!font.translated) {
+ font.translated = self.translateFont(font, xref, resources,
+ dependency);
+ if (font.translated) {
+ // keep track of each font we translated so the caller can
+ // load them asynchronously before calling display on a page
+ loadedName = 'font_' + uniquePrefix + (++self.objIdCounter);
+ font.translated.properties.loadedName = loadedName;
+ font.loadedName = loadedName;
+
+ var translated = font.translated;
+ handler.send('obj', [
+ loadedName,
+ 'Font',
+ translated.name,
+ translated.file,
+ translated.properties
+ ]);
+ }
+ }
+ loadedName = loadedName || font.loadedName;
+
+ // Ensure the font is ready before the font is set
+ // and later on used for drawing.
+ // TODO: This should get insert to the IRQueue only once per
+ // page.
+ insertDependency([loadedName]);
+ return loadedName;
+ }
+
+ function buildPaintImageXObject(image, inline) {
+ var dict = image.dict;
+ var w = dict.get('Width', 'W');
+ var h = dict.get('Height', 'H');
+
+ if (image instanceof JpegStream && image.isNative) {
+ var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
+ handler.send('obj', [objId, 'JpegStream', image.getIR()]);
+
+ // Add the dependency on the image object.
+ insertDependency([objId]);
+
+ // The normal fn.
+ fn = 'paintJpegXObject';
+ args = [objId, w, h];
+
+ return;
+ }
+
+ // Needs to be rendered ourself.
+
+ // Figure out if the image has an imageMask.
+ var imageMask = dict.get('ImageMask', 'IM') || false;
+
+ // If there is no imageMask, create the PDFImage and a lot
+ // of image processing can be done here.
+ if (!imageMask) {
+ var imageObj = new PDFImage(xref, resources, image, inline);
+
+ if (imageObj.imageMask) {
+ throw 'Can\'t handle this in the web worker :/';
+ }
+
+ var imgData = {
+ width: w,
+ height: h,
+ data: new Uint8Array(w * h * 4)
+ };
+ var pixels = imgData.data;
+ imageObj.fillRgbaBuffer(pixels, imageObj.decode);
+
+ fn = 'paintImageXObject';
+ args = [imgData];
+ return;
+ }
+
+ // This depends on a tmpCanvas beeing filled with the
+ // current fillStyle, such that processing the pixel
+ // data can't be done here. Instead of creating a
+ // complete PDFImage, only read the information needed
+ // for later.
+ fn = 'paintImageMaskXObject';
+
+ var width = dict.get('Width', 'W');
+ var height = dict.get('Height', 'H');
+ var bitStrideLength = (width + 7) >> 3;
+ var imgArray = image.getBytes(bitStrideLength * height);
+ var decode = dict.get('Decode', 'D');
+ var inverseDecode = !!decode && decode[0] > 0;
+
+ args = [imgArray, inverseDecode, width, height];
+ }
+
+ uniquePrefix = uniquePrefix || '';
+ if (!queue.argsArray) {
+ queue.argsArray = [];
+ }
+ if (!queue.fnArray) {
+ queue.fnArray = [];
+ }
+
+ var fnArray = queue.fnArray, argsArray = queue.argsArray;
+ var dependencyArray = dependency || [];
+
+ resources = xref.fetchIfRef(resources) || new Dict();
+ var xobjs = xref.fetchIfRef(resources.get('XObject')) || new Dict();
+ var patterns = xref.fetchIfRef(resources.get('Pattern')) || new Dict();
+ var parser = new Parser(new Lexer(stream), false);
+ var res = resources;
+ var args = [], obj;
+ var getObjBt = function getObjBt() {
+ parser = this.oldParser;
+ return { name: 'BT' };
+ };
+ var TILING_PATTERN = 1, SHADING_PATTERN = 2;
+
+ while (!isEOF(obj = parser.getObj())) {
+ if (isCmd(obj)) {
+ var cmd = obj.cmd;
+ var fn = OP_MAP[cmd];
+ if (!fn) {
+ // invalid content command, trying to recover
+ if (cmd.substr(-2) == 'BT') {
+ fn = OP_MAP[cmd.substr(0, cmd.length - 2)];
+ // feeding 'BT' on next interation
+ parser = {
+ getObj: getObjBt,
+ oldParser: parser
+ };
+ }
+ }
+ assertWellFormed(fn, 'Unknown command "' + cmd + '"');
+ // TODO figure out how to type-check vararg functions
+
+ if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
+ // Use the IR version for setStroke/FillColorN.
+ fn += '_IR';
+
+ // compile tiling patterns
+ var patternName = args[args.length - 1];
+ // SCN/scn applies patterns along with normal colors
+ if (isName(patternName)) {
+ var pattern = xref.fetchIfRef(patterns.get(patternName.name));
+ if (pattern) {
+ var dict = isStream(pattern) ? pattern.dict : pattern;
+ var typeNum = dict.get('PatternType');
+
+ if (typeNum == TILING_PATTERN) {
+ // Create an IR of the pattern code.
+ var depIdx = dependencyArray.length;
+ var queueObj = {};
+ var codeIR = this.getIRQueue(pattern, dict.get('Resources'),
+ queueObj, dependencyArray);
+
+ // Add the dependencies that are required to execute the
+ // codeIR.
+ insertDependency(dependencyArray.slice(depIdx));
+
+ args = TilingPattern.getIR(codeIR, dict, args);
+ }
+ else if (typeNum == SHADING_PATTERN) {
+ var shading = xref.fetchIfRef(dict.get('Shading'));
+ var matrix = dict.get('Matrix');
+ var pattern = Pattern.parseShading(shading, matrix, xref, res,
+ null /*ctx*/);
+ args = pattern.getIR();
+ } else {
+ error('Unkown PatternType ' + typeNum);
+ }
+ }
+ }
+ } else if (cmd == 'Do' && !args[0].code) {
+ // eagerly compile XForm objects
+ var name = args[0].name;
+ var xobj = xobjs.get(name);
+ if (xobj) {
+ xobj = xref.fetchIfRef(xobj);
+ assertWellFormed(isStream(xobj), 'XObject should be a stream');
+
+ var type = xobj.dict.get('Subtype');
+ assertWellFormed(
+ isName(type),
+ 'XObject should have a Name subtype'
+ );
+
+ if ('Form' == type.name) {
+ var matrix = xobj.dict.get('Matrix');
+ var bbox = xobj.dict.get('BBox');
+
+ fnArray.push('paintFormXObjectBegin');
+ argsArray.push([matrix, bbox]);
+
+ // This adds the IRQueue of the xObj to the current queue.
+ var depIdx = dependencyArray.length;
+
+ this.getIRQueue(xobj, xobj.dict.get('Resources'), queue,
+ dependencyArray);
+
+ // Add the dependencies that are required to execute the
+ // codeIR.
+ insertDependency(dependencyArray.slice(depIdx));
+
+ fn = 'paintFormXObjectEnd';
+ args = [];
+ } else if ('Image' == type.name) {
+ buildPaintImageXObject(xobj, false);
+ } else {
+ error('Unhandled XObject subtype ' + type.name);
+ }
+ }
+ } else if (cmd == 'Tf') { // eagerly collect all fonts
+ args[0] = handleSetFont(args[0].name);
+ } else if (cmd == 'EI') {
+ buildPaintImageXObject(args[0], true);
+ }
+
+ switch (fn) {
+ // Parse the ColorSpace data to a raw format.
+ case 'setFillColorSpace':
+ case 'setStrokeColorSpace':
+ args = [ColorSpace.parseToIR(args[0], xref, resources)];
+ break;
+ case 'shadingFill':
+ var shadingRes = xref.fetchIfRef(res.get('Shading'));
+ if (!shadingRes)
+ error('No shading resource found');
+
+ var shading = xref.fetchIfRef(shadingRes.get(args[0].name));
+ if (!shading)
+ error('No shading object found');
+
+ var shadingFill = Pattern.parseShading(shading, null, xref, res,
+ null);
+ var patternIR = shadingFill.getIR();
+ args = [patternIR];
+ fn = 'shadingFill';
+ break;
+ case 'setGState':
+ var dictName = args[0];
+ var extGState = xref.fetchIfRef(resources.get('ExtGState'));
+
+ if (!isDict(extGState) || !extGState.has(dictName.name))
+ break;
+
+ var gsState = xref.fetchIfRef(extGState.get(dictName.name));
+
+ // This array holds the converted/processed state data.
+ var gsStateObj = [];
+
+ gsState.forEach(
+ function canvasGraphicsSetGStateForEach(key, value) {
+ switch (key) {
+ case 'Type':
+ break;
+ case 'LW':
+ case 'LC':
+ case 'LJ':
+ case 'ML':
+ case 'D':
+ case 'RI':
+ case 'FL':
+ case 'CA':
+ case 'ca':
+ gsStateObj.push([key, value]);
+ break;
+ case 'Font':
+ gsStateObj.push([
+ 'Font',
+ handleSetFont(null, value[0]),
+ value[1]
+ ]);
+ break;
+ case 'OP':
+ case 'op':
+ case 'OPM':
+ case 'BG':
+ case 'BG2':
+ case 'UCR':
+ case 'UCR2':
+ case 'TR':
+ case 'TR2':
+ case 'HT':
+ case 'SM':
+ case 'SA':
+ case 'BM':
+ case 'SMask':
+ case 'AIS':
+ case 'TK':
+ TODO('graphic state operator ' + key);
+ break;
+ default:
+ warn('Unknown graphic state operator ' + key);
+ break;
+ }
+ }
+ );
+ args = [gsStateObj];
+ break;
+ } // switch
+
+ fnArray.push(fn);
+ argsArray.push(args);
+ args = [];
+ } else if (obj != null) {
+ assertWellFormed(args.length <= 33, 'Too many arguments');
+ args.push(obj);
+ }
+ }
+
+ return {
+ fnArray: fnArray,
+ argsArray: argsArray
+ };
+ },
+
+ extractDataStructures: function
+ partialEvaluatorExtractDataStructures(dict, baseDict,
+ xref, properties) {
+ // 9.10.2
+ var toUnicode = dict.get('ToUnicode') ||
+ baseDict.get('ToUnicode');
+ if (toUnicode)
+ properties.toUnicode = this.readToUnicode(toUnicode, xref);
+
+ if (properties.composite) {
+ // CIDSystemInfo helps to match CID to glyphs
+ var cidSystemInfo = xref.fetchIfRef(dict.get('CIDSystemInfo'));
+ if (isDict(cidSystemInfo)) {
+ properties.cidSystemInfo = {
+ registry: cidSystemInfo.get('Registry'),
+ ordering: cidSystemInfo.get('Ordering'),
+ supplement: cidSystemInfo.get('Supplement')
+ };
+ }
+
+ var cidToGidMap = xref.fetchIfRef(dict.get('CIDToGIDMap'));
+ if (isStream(cidToGidMap))
+ properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+ }
+
+ var differences = [];
+ var baseEncoding = Encodings.StandardEncoding;
+ var hasEncoding = dict.has('Encoding');
+ if (hasEncoding) {
+ var encoding = xref.fetchIfRef(dict.get('Encoding'));
+ if (isDict(encoding)) {
+ var baseName = encoding.get('BaseEncoding');
+ if (baseName)
+ baseEncoding = Encodings[baseName.name];
+
+ // Load the differences between the base and original
+ if (encoding.has('Differences')) {
+ var diffEncoding = encoding.get('Differences');
+ var index = 0;
+ for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+ var data = diffEncoding[j];
+ if (isNum(data))
+ index = data;
+ else
+ differences[index++] = data.name;
+ }
+ }
+ } else if (isName(encoding)) {
+ baseEncoding = Encodings[encoding.name];
+ } else {
+ error('Encoding is not a Name nor a Dict');
+ }
+ }
+ properties.differences = differences;
+ properties.baseEncoding = baseEncoding;
+ properties.hasEncoding = hasEncoding;
+ },
+
+ readToUnicode:
+ function partialEvaluatorReadToUnicode(toUnicode, xref) {
+ var cmapObj = xref.fetchIfRef(toUnicode);
+ var charToUnicode = [];
+ if (isName(cmapObj)) {
+ var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
+ if (!isIdentityMap)
+ error('ToUnicode file cmap translation not implemented');
+ } else if (isStream(cmapObj)) {
+ var tokens = [];
+ var token = '';
+ var beginArrayToken = {};
+
+ var cmap = cmapObj.getBytes(cmapObj.length);
+ for (var i = 0, ii = cmap.length; i < ii; i++) {
+ var byte = cmap[i];
+ if (byte == 0x20 || byte == 0x0D || byte == 0x0A ||
+ byte == 0x3C || byte == 0x5B || byte == 0x5D) {
+ switch (token) {
+ case 'usecmap':
+ error('usecmap is not implemented');
+ break;
+
+ case 'beginbfchar':
+ case 'beginbfrange':
+ case 'begincidchar':
+ case 'begincidrange':
+ token = '';
+ tokens = [];
+ break;
+
+ case 'endcidrange':
+ case 'endbfrange':
+ for (var j = 0, jj = tokens.length; j < jj; j += 3) {
+ var startRange = tokens[j];
+ var endRange = tokens[j + 1];
+ var code = tokens[j + 2];
+ while (startRange <= endRange) {
+ charToUnicode[startRange] = code++;
+ ++startRange;
+ }
+ }
+ break;
+
+ case 'endcidchar':
+ case 'endbfchar':
+ for (var j = 0, jj = tokens.length; j < jj; j += 2) {
+ var index = tokens[j];
+ var code = tokens[j + 1];
+ charToUnicode[index] = code;
+ }
+ break;
+
+ case '':
+ break;
+
+ default:
+ if (token[0] >= '0' && token[0] <= '9')
+ token = parseInt(token, 10); // a number
+ tokens.push(token);
+ token = '';
+ }
+ switch (byte) {
+ case 0x5B:
+ // begin list parsing
+ tokens.push(beginArrayToken);
+ break;
+ case 0x5D:
+ // collect array items
+ var items = [], item;
+ while (tokens.length &&
+ (item = tokens.pop()) != beginArrayToken)
+ items.unshift(item);
+ tokens.push(items);
+ break;
+ }
+ } else if (byte == 0x3E) {
+ if (token.length) {
+ // parsing hex number
+ tokens.push(parseInt(token, 16));
+ token = '';
+ }
+ } else {
+ token += String.fromCharCode(byte);
+ }
+ }
+ }
+ return charToUnicode;
+ },
+ readCidToGidMap:
+ function partialEvaluatorReadCidToGidMap(cidToGidStream) {
+ // Extract the encoding from the CIDToGIDMap
+ var glyphsData = cidToGidStream.getBytes();
+
+ // Set encoding 0 to later verify the font has an encoding
+ var result = [];
+ for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+ var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
+ if (glyphID == 0)
+ continue;
+
+ var code = j >> 1;
+ result[code] = glyphID;
+ }
+ return result;
+ },
+
+ extractWidths: function partialEvaluatorWidths(dict,
+ xref,
+ descriptor,
+ properties) {
+ var glyphsWidths = [];
+ var defaultWidth = 0;
+ if (properties.composite) {
+ defaultWidth = xref.fetchIfRef(dict.get('DW')) || 1000;
+
+ var widths = xref.fetchIfRef(dict.get('W'));
+ if (widths) {
+ var start = 0, end = 0;
+ for (var i = 0, ii = widths.length; i < ii; i++) {
+ var code = widths[i];
+ if (isArray(code)) {
+ for (var j = 0, jj = code.length; j < jj; j++)
+ glyphsWidths[start++] = code[j];
+ start = 0;
+ } else if (start) {
+ var width = widths[++i];
+ for (var j = start; j <= code; j++)
+ glyphsWidths[j] = width;
+ start = 0;
+ } else {
+ start = code;
+ }
+ }
+ }
+ } else {
+ var firstChar = properties.firstChar;
+ var widths = xref.fetchIfRef(dict.get('Widths'));
+ if (widths) {
+ var j = firstChar;
+ for (var i = 0, ii = widths.length; i < ii; i++)
+ glyphsWidths[j++] = widths[i];
+ defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
+ } else {
+ // Trying get the BaseFont metrics (see comment above).
+ var baseFontName = dict.get('BaseFont');
+ if (isName(baseFontName)) {
+ var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+ glyphsWidths = metrics.widths;
+ defaultWidth = metrics.defaultWidth;
+ }
+ }
+ }
+
+ properties.defaultWidth = defaultWidth;
+ properties.widths = glyphsWidths;
+ },
+
+ getBaseFontMetrics: function getBaseFontMetrics(name) {
+ var defaultWidth = 0, widths = [];
+ var glyphWidths = Metrics[stdFontMap[name] || name];
+ if (isNum(glyphWidths)) {
+ defaultWidth = glyphWidths;
+ } else {
+ widths = glyphWidths;
+ }
+
+ return {
+ defaultWidth: defaultWidth,
+ widths: widths
+ };
+ },
+
+ translateFont: function partialEvaluatorTranslateFont(dict, xref, resources,
+ dependency) {
+ var baseDict = dict;
+ var type = dict.get('Subtype');
+ assertWellFormed(isName(type), 'invalid font Subtype');
+
+ var composite = false;
+ if (type.name == 'Type0') {
+ // If font is a composite
+ // - get the descendant font
+ // - set the type according to the descendant font
+ // - get the FontDescriptor from the descendant font
+ var df = dict.get('DescendantFonts');
+ if (!df)
+ return null;
+
+ if (isRef(df))
+ df = xref.fetch(df);
+
+ dict = xref.fetchIfRef(isRef(df) ? df : df[0]);
+
+ type = dict.get('Subtype');
+ assertWellFormed(isName(type), 'invalid font Subtype');
+ composite = true;
+ }
+ var maxCharIndex = composite ? 0xFFFF : 0xFF;
+
+ var descriptor = xref.fetchIfRef(dict.get('FontDescriptor'));
+ if (!descriptor) {
+ if (type.name == 'Type3') {
+ // FontDescriptor is only required for Type3 fonts when the document
+ // is a tagged pdf. Create a barbebones one to get by.
+ descriptor = new Dict();
+ descriptor.set('FontName', new Name(type.name));
+ } else {
+ // Before PDF 1.5 if the font was one of the base 14 fonts, having a
+ // FontDescriptor was not required.
+ // This case is here for compatibility.
+ var baseFontName = dict.get('BaseFont');
+ if (!isName(baseFontName))
+ return null;
+
+ // Using base font name as a font name.
+ baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+ var metrics = this.getBaseFontMetrics(baseFontName);
+
+ var properties = {
+ type: type.name,
+ widths: metrics.widths,
+ defaultWidth: metrics.defaultWidth,
+ firstChar: 0,
+ lastChar: maxCharIndex
+ };
+ this.extractDataStructures(dict, dict, xref, properties);
+
+ return {
+ name: baseFontName,
+ dict: baseDict,
+ properties: properties
+ };
+ }
+
+ }
+
+ // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
+ // 'LastChar' and 'Widths' should exists too, but some PDF encoders seems
+ // to ignore this rule when a variant of a standart font is used.
+ // TODO Fill the width array depending on which of the base font this is
+ // a variant.
+ var firstChar = xref.fetchIfRef(dict.get('FirstChar')) || 0;
+ var lastChar = xref.fetchIfRef(dict.get('LastChar')) || maxCharIndex;
+ var fontName = xref.fetchIfRef(descriptor.get('FontName'));
+ assertWellFormed(isName(fontName), 'invalid font name');
+
+ var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+ if (fontFile) {
+ fontFile = xref.fetchIfRef(fontFile);
+ if (fontFile.dict) {
+ var subtype = fontFile.dict.get('Subtype');
+ if (subtype)
+ subtype = subtype.name;
+
+ var length1 = fontFile.dict.get('Length1');
+ if (!isInt(length1))
+ length1 = xref.fetchIfRef(length1);
+
+ var length2 = fontFile.dict.get('Length2');
+ if (!isInt(length2))
+ length2 = xref.fetchIfRef(length2);
+ }
+ }
+
+ var properties = {
+ type: type.name,
+ subtype: subtype,
+ file: fontFile,
+ length1: length1,
+ length2: length2,
+ composite: composite,
+ fixedPitch: false,
+ fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
+ firstChar: firstChar || 0,
+ lastChar: lastChar || maxCharIndex,
+ bbox: descriptor.get('FontBBox'),
+ ascent: descriptor.get('Ascent'),
+ descent: descriptor.get('Descent'),
+ xHeight: descriptor.get('XHeight'),
+ capHeight: descriptor.get('CapHeight'),
+ flags: descriptor.get('Flags'),
+ italicAngle: descriptor.get('ItalicAngle'),
+ coded: false
+ };
+ this.extractWidths(dict, xref, descriptor, properties);
+ this.extractDataStructures(dict, baseDict, xref, properties);
+
+ if (type.name === 'Type3') {
+ properties.coded = true;
+ var charProcs = xref.fetchIfRef(dict.get('CharProcs'));
+ var fontResources = xref.fetchIfRef(dict.get('Resources')) || resources;
+ properties.resources = fontResources;
+ properties.charProcIRQueues = {};
+ for (var key in charProcs.map) {
+ var glyphStream = xref.fetchIfRef(charProcs.map[key]);
+ var queueObj = {};
+ properties.charProcIRQueues[key] =
+ this.getIRQueue(glyphStream, fontResources, queueObj, dependency);
+ }
+ }
+
+ return {
+ name: fontName.name,
+ dict: baseDict,
+ file: fontFile,
+ properties: properties
+ };
+ }
+ };
+
+ return constructor;
+})();
+
+var EvalState = (function evalState() {
+ function constructor() {
+ // Are soft masks and alpha values shapes or opacities?
+ this.alphaIsShape = false;
+ this.fontSize = 0;
+ this.textMatrix = IDENTITY_MATRIX;
+ this.leading = 0;
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ // Color spaces
+ this.fillColorSpace = null;
+ this.strokeColorSpace = null;
+ }
+ constructor.prototype = {
+ };
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var isWorker = (typeof window == 'undefined');
+
+/**
+ * Maximum time to wait for a font to be loaded by font-face rules.
+ */
+var kMaxWaitForFontFace = 1000;
+
+// Unicode Private Use Area
+var kCmapGlyphOffset = 0xE000;
+var kSizeOfGlyphArea = 0x1900;
+
+// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
+// except for Type 3 fonts
+var kPDFGlyphSpaceUnits = 1000;
+
+// Until hinting is fully supported this constant can be used
+var kHintingEnabled = false;
+
+var Encodings = {
+ get ExpertEncoding() {
+ return shadow(this, 'ExpertEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '',
+ 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+ 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+ 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+ 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'questionsmall', '',
+ 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '',
+ '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior',
+ 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff',
+ 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
+ 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '',
+ 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
+ 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
+ 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
+ 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
+ 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
+ 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
+ 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
+ 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
+ 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
+ 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'
+ ]);
+ },
+ get MacExpertEncoding() {
+ return shadow(this, 'MacExpertEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall',
+ 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+ 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior',
+ 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period',
+ 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+ 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+ 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon',
+ '', 'threequartersemdash', '', 'questionsmall', '', '', '', '',
+ 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters',
+ 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird',
+ 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',
+ 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall',
+ 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall',
+ 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall',
+ 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall',
+ 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall',
+ 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '',
+ 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall',
+ 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall',
+ 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
+ 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
+ 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
+ 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
+ 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
+ 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
+ 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
+ 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
+ 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
+ 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
+ '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '',
+ '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '',
+ 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior',
+ 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall',
+ 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior',
+ 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'
+ ]);
+ },
+ get MacRomanEncoding() {
+ return shadow(this, 'MacRomanEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring',
+ 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute',
+ 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla',
+ 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave',
+ 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex',
+ 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis',
+ 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph',
+ 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus',
+ 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',
+ 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega',
+ 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical',
+ 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',
+ 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+ 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+ 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+ 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
+ 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
+ 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
+ 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla',
+ 'hungarumlaut', 'ogonek', 'caron'
+ ]);
+ },
+ get StandardEncoding() {
+ return shadow(this, 'StandardEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', 'exclamdown',
+ 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring',
+ 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '',
+ 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine',
+ '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash',
+ 'oslash', 'oe', 'germandbls'
+ ]);
+ },
+ get WinAnsiEncoding() {
+ return shadow(this, 'WinAnsiEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro',
+ 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis',
+ 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
+ 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet',
+ 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet',
+ 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright',
+ 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent',
+ 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis',
+ 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen',
+ 'registered', 'macron', 'degree', 'plusminus', 'twosuperior',
+ 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter',
+ 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute',
+ 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave',
+ 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae',
+ 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave',
+ 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
+ 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
+ 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
+ 'ydieresis'
+ ]);
+ },
+ get symbolsEncoding() {
+ return shadow(this, 'symbolsEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign',
+ 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft',
+ 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period',
+ 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',
+ 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon',
+ 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu',
+ 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1',
+ 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright',
+ 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi',
+ 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa',
+ 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau',
+ 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar',
+ 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction',
+ 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth',
+ 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus',
+ 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff',
+ 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis',
+ 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur',
+ 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset',
+ 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset',
+ 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle',
+ 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif',
+ 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor',
+ 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright',
+ 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans',
+ 'trademarksans', 'summation', 'parenlefttp', 'parenleftex',
+ 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt',
+ 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '',
+ 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
+ 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
+ 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
+ 'bracerightbt'
+ ]);
+ },
+ get zapfDingbatsEncoding() {
+ return shadow(this, 'zapfDingbatsEncoding', ['', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4',
+ 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16',
+ 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25',
+ 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31',
+ 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41',
+ 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51',
+ 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61',
+ 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71',
+ 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79',
+ 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',
+ 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',
+ 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',
+ 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',
+ 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',
+ 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',
+ 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',
+ 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',
+ 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',
+ 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197',
+ 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190',
+ 'a191'
+ ]);
+ }
+};
+
+/**
+ * Hold a map of decoded fonts and of the standard fourteen Type1
+ * fonts and their acronyms.
+ */
+var stdFontMap = {
+ 'ArialNarrow': 'Helvetica',
+ 'ArialNarrow-Bold': 'Helvetica-Bold',
+ 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialNarrow-Italic': 'Helvetica-Oblique',
+ 'ArialBlack': 'Helvetica',
+ 'ArialBlack-Bold': 'Helvetica-Bold',
+ 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialBlack-Italic': 'Helvetica-Oblique',
+ 'Arial': 'Helvetica',
+ 'Arial-Bold': 'Helvetica-Bold',
+ 'Arial-BoldItalic': 'Helvetica-BoldOblique',
+ 'Arial-Italic': 'Helvetica-Oblique',
+ 'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
+ 'Arial-BoldMT': 'Helvetica-Bold',
+ 'Arial-ItalicMT': 'Helvetica-Oblique',
+ 'ArialMT': 'Helvetica',
+ 'Courier-Bold': 'Courier-Bold',
+ 'Courier-BoldItalic': 'Courier-BoldOblique',
+ 'Courier-Italic': 'Courier-Oblique',
+ 'CourierNew': 'Courier',
+ 'CourierNew-Bold': 'Courier-Bold',
+ 'CourierNew-BoldItalic': 'Courier-BoldOblique',
+ 'CourierNew-Italic': 'Courier-Oblique',
+ 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
+ 'CourierNewPS-BoldMT': 'Courier-Bold',
+ 'CourierNewPS-ItalicMT': 'Courier-Oblique',
+ 'CourierNewPSMT': 'Courier',
+ 'Helvetica-Bold': 'Helvetica-Bold',
+ 'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
+ 'Helvetica-Italic': 'Helvetica-Oblique',
+ 'Symbol-Bold': 'Symbol',
+ 'Symbol-BoldItalic': 'Symbol',
+ 'Symbol-Italic': 'Symbol',
+ 'TimesNewRoman': 'Times-Roman',
+ 'TimesNewRoman-Bold': 'Times-Bold',
+ 'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRoman-Italic': 'Times-Italic',
+ 'TimesNewRomanPS': 'Times-Roman',
+ 'TimesNewRomanPS-Bold': 'Times-Bold',
+ 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldMT': 'Times-Bold',
+ 'TimesNewRomanPS-Italic': 'Times-Italic',
+ 'TimesNewRomanPS-ItalicMT': 'Times-Italic',
+ 'TimesNewRomanPSMT': 'Times-Roman',
+ 'TimesNewRomanPSMT-Bold': 'Times-Bold',
+ 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPSMT-Italic': 'Times-Italic'
+};
+
+var serifFonts = {
+ 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
+ 'Aldus': true, 'Alexandria': true, 'Algerian': true,
+ 'American Typewriter': true, 'Antiqua': true, 'Apex': true,
+ 'Arno': true, 'Aster': true, 'Aurora': true,
+ 'Baskerville': true, 'Bell': true, 'Bembo': true,
+ 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
+ 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
+ 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
+ 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
+ 'Calvert': true, 'Capitals': true, 'Cambria': true,
+ 'Cartier': true, 'Caslon': true, 'Catull': true,
+ 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
+ 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
+ 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
+ 'Cochin': true, 'Colonna': true, 'Computer Modern': true,
+ 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
+ 'Corona': true, 'Ecotype': true, 'Egyptienne': true,
+ 'Elephant': true, 'Excelsior': true, 'Fairfield': true,
+ 'FF Scala': true, 'Folkard': true, 'Footlight': true,
+ 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
+ 'Gentium': true, 'Georgia': true, 'Gloucester': true,
+ 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
+ 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
+ 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
+ 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
+ 'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
+ 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
+ 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
+ 'Lucida Bright': true, 'Melior': true, 'Memphis': true,
+ 'Miller': true, 'Minion': true, 'Modern': true,
+ 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
+ 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
+ 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
+ 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
+ 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
+ 'Requiem': true, 'Rockwell': true, 'Roman': true,
+ 'Rotis Serif': true, 'Sabon': true, 'Scala': true,
+ 'Seagull': true, 'Sistina': true, 'Souvenir': true,
+ 'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
+ 'Sylfaen': true, 'Times': true, 'Trajan': true,
+ 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
+ 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
+ 'Versailles': true, 'Wanted': true, 'Weiss': true,
+ 'Wide Latin': true, 'Windsor': true, 'XITS': true
+};
+
+var FontLoader = {
+ listeningForFontLoad: false,
+
+ bind: function fontLoaderBind(fonts, callback) {
+ function checkFontsLoaded() {
+ for (var i = 0, ii = objs.length; i < ii; i++) {
+ var fontObj = objs[i];
+ if (fontObj.loading) {
+ return false;
+ }
+ }
+
+ document.documentElement.removeEventListener(
+ 'pdfjsFontLoad', checkFontsLoaded, false);
+
+ callback();
+ return true;
+ }
+
+ var rules = [], names = [], objs = [];
+
+ for (var i = 0, ii = fonts.length; i < ii; i++) {
+ var font = fonts[i];
+
+ // If there is already a fontObj on the font, then it was loaded/attached
+ // to the page already and we don't have to do anything for this font
+ // here future.
+ if (font.fontObj) {
+ continue;
+ }
+
+ var obj = new Font(font.name, font.file, font.properties);
+
+ // Store the fontObj on the font such that `setFont` in CanvasGraphics
+ // can reuse it later again.
+ font.fontObj = obj;
+
+ objs.push(obj);
+
+ var str = '';
+ var data = obj.data;
+ if (data) {
+ var length = data.length;
+ for (var j = 0; j < length; j++)
+ str += String.fromCharCode(data[j]);
+
+ var rule = isWorker ? obj.bindWorker(str) : obj.bindDOM(str);
+ if (rule) {
+ rules.push(rule);
+ names.push(obj.loadedName);
+ }
+ }
+ }
+
+ this.listeningForFontLoad = false;
+ if (!isWorker && rules.length) {
+ FontLoader.prepareFontLoadEvent(rules, names, objs);
+ }
+
+ if (!checkFontsLoaded()) {
+ document.documentElement.addEventListener(
+ 'pdfjsFontLoad', checkFontsLoaded, false);
+ }
+
+ return objs;
+ },
+ // Set things up so that at least one pdfjsFontLoad event is
+ // dispatched when all the @font-face |rules| for |names| have been
+ // loaded in a subdocument. It's expected that the load of |rules|
+ // has already started in this (outer) document, so that they should
+ // be ordered before the load in the subdocument.
+ prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
+ objs) {
+ /** Hack begin */
+ // There's no event when a font has finished downloading so the
+ // following code is a dirty hack to 'guess' when a font is
+ // ready. This code will be obsoleted by Mozilla bug 471915.
+ //
+ // The only reliable way to know if a font is loaded in Gecko
+ // (at the moment) is document.onload in a document with
+ // a @font-face rule defined in a "static" stylesheet. We use a
+ // subdocument in an <iframe>, set up properly, to know when
+ // our @font-face rule was loaded. However, the subdocument and
+ // outer document can't share CSS rules, so the inner document
+ // is only part of the puzzle. The second piece is an invisible
+ // div created in order to force loading of the @font-face in
+ // the *outer* document. (The font still needs to be loaded for
+ // its metrics, for reflow). We create the div first for the
+ // outer document, then create the iframe. Unless something
+ // goes really wonkily, we expect the @font-face for the outer
+ // document to be processed before the inner. That's still
+ // fragile, but seems to work in practice.
+ //
+ // The postMessage() hackery was added to work around chrome bug
+ // 82402.
+
+ var div = document.createElement('div');
+ div.setAttribute('style',
+ 'visibility: hidden;' +
+ 'width: 10px; height: 10px;' +
+ 'position: absolute; top: 0px; left: 0px;');
+ var html = '';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ html += '<span style="font-family:' + names[i] + '">Hi</span>';
+ }
+ div.innerHTML = html;
+ document.body.appendChild(div);
+
+ if (!this.listeningForFontLoad) {
+ window.addEventListener(
+ 'message',
+ function fontLoaderMessage(e) {
+ var fontNames = JSON.parse(e.data);
+ for (var i = 0, ii = objs.length; i < ii; ++i) {
+ var font = objs[i];
+ font.loading = false;
+ }
+ var evt = document.createEvent('Events');
+ evt.initEvent('pdfjsFontLoad', true, false);
+ document.documentElement.dispatchEvent(evt);
+ },
+ false);
+ this.listeningForFontLoad = true;
+ }
+
+ // XXX we should have a time-out here too, and maybe fire
+ // pdfjsFontLoadFailed?
+ var src = '<!DOCTYPE HTML><html><head>';
+ src += '<style type="text/css">';
+ for (var i = 0, ii = rules.length; i < ii; ++i) {
+ src += rules[i];
+ }
+ src += '</style>';
+ src += '<script type="application/javascript">';
+ var fontNamesArray = '';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ fontNamesArray += '"' + names[i] + '", ';
+ }
+ src += ' var fontNames=[' + fontNamesArray + '];\n';
+ src += ' window.onload = function fontLoaderOnload() {\n';
+ src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n';
+ src += ' }';
+ src += '</script></head><body>';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
+ }
+ src += '</body></html>';
+ var frame = document.createElement('iframe');
+ frame.src = 'data:text/html,' + src;
+ frame.setAttribute('style',
+ 'visibility: hidden;' +
+ 'width: 10px; height: 10px;' +
+ 'position: absolute; top: 0px; left: 0px;');
+ document.body.appendChild(frame);
+ /** Hack end */
+ }
+};
+
+var UnicodeRanges = [
+ { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
+ { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
+ { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
+ { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
+ { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
+ { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
+ { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
+ { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
+ { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
+ { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
+ { 'begin': 0x0530, 'end': 0x058F }, // Armenian
+ { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
+ { 'begin': 0xA500, 'end': 0xA63F }, // Vai
+ { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
+ { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
+ { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
+ { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
+ { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
+ { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
+ { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
+ { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
+ { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
+ { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
+ { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
+ { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
+ { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
+ { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
+ { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
+ { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
+ { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
+ { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
+ { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
+ { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
+ { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
+ { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
+ { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
+ { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
+ { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
+ { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
+ { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
+ { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
+ { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
+ { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
+ { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
+ { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
+ { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
+ { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
+ { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
+ { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
+ { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
+ { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
+ { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
+ { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
+ { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
+ { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
+ { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
+ { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
+ { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
+ { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
+ { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
+ { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
+ { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
+ { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
+ { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
+ { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
+ { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
+ { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
+ { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
+ { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
+ { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
+ { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
+ { 'begin': 0x0700, 'end': 0x074F }, // Syriac
+ { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
+ { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
+ { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
+ { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
+ { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
+ { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
+ { 'begin': 0x1680, 'end': 0x169F }, // Ogham
+ { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
+ { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
+ { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
+ { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
+ { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
+ { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
+ { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
+ { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
+ { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
+ { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
+ { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
+ { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
+ { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
+ { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
+ { 'begin': 0x1900, 'end': 0x194F }, // Limbu
+ { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
+ { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
+ { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
+ { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
+ { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
+ { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
+ { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
+ { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
+ { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
+ { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
+ { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
+ { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
+ { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
+ { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
+ { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
+ { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
+ { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
+ { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
+ { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
+ { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
+ { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
+ { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
+ { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
+ { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
+ { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
+ { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
+ { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
+ { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
+ { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles
+];
+
+var MacStandardGlyphOrdering = [
+ '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
+ 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+ 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
+ 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
+ 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+ 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
+ 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
+ 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
+ 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
+ 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
+ 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
+ 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
+ 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
+ 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+ 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+ 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+ 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
+ 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
+ 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
+ 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
+ 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
+ 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
+ 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
+ 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
+ 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
+ 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+
+function getUnicodeRangeFor(value) {
+ for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+ var range = UnicodeRanges[i];
+ if (value >= range.begin && value < range.end)
+ return i;
+ }
+ return -1;
+}
+
+function adaptUnicode(unicode) {
+ return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ?
+ unicode + kCmapGlyphOffset : unicode;
+}
+
+function isAdaptedUnicode(unicode) {
+ return unicode >= kCmapGlyphOffset &&
+ unicode < kCmapGlyphOffset + kSizeOfGlyphArea;
+}
+
+function isSpecialUnicode(unicode) {
+ return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
+ unicode >= kCmapGlyphOffset &&
+ unicode < kCmapGlyphOffset + kSizeOfGlyphArea;
+}
+
+/**
+ * 'Font' is the class the outside world should use, it encapsulate all the font
+ * decoding logics whatever type it is (assuming the font type is supported).
+ *
+ * For example to read a Type1 font and to attach it to the document:
+ * var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
+ * type1Font.bind();
+ */
+var Font = (function Font() {
+ var constructor = function font_constructor(name, file, properties) {
+ this.name = name;
+ this.coded = properties.coded;
+ this.charProcIRQueues = properties.charProcIRQueues;
+ this.resources = properties.resources;
+ this.sizes = [];
+
+ var names = name.split('+');
+ names = names.length > 1 ? names[1] : names[0];
+ names = names.split(/[-,_]/g)[0];
+ this.serif = serifFonts[names] || (name.search(/serif/gi) != -1);
+
+ var type = properties.type;
+ this.type = type;
+
+ // If the font is to be ignored, register it like an already loaded font
+ // to avoid the cost of waiting for it be be loaded by the platform.
+ if (properties.ignore) {
+ this.loadedName = this.serif ? 'serif' : 'sans-serif';
+ this.loading = false;
+ return;
+ }
+
+ this.differences = properties.differences;
+ this.widths = properties.widths;
+ this.defaultWidth = properties.defaultWidth;
+ this.composite = properties.composite;
+ this.toUnicode = properties.toUnicode;
+ this.hasEncoding = properties.hasEncoding;
+
+ this.fontMatrix = properties.fontMatrix;
+ if (properties.type == 'Type3')
+ return;
+
+ // Trying to fix encoding using glyph CIDSystemInfo.
+ this.loadCidToUnicode(properties);
+
+ if (!file) {
+ // The file data is not specified. Trying to fix the font name
+ // to be used with the canvas.font.
+ var fontName = name.replace(/[,_]/g, '-');
+ fontName = stdFontMap[fontName] || fontName;
+
+ this.bold = (fontName.search(/bold/gi) != -1);
+ this.italic = (fontName.search(/oblique/gi) != -1) ||
+ (fontName.search(/italic/gi) != -1);
+
+ // Use 'name' instead of 'fontName' here because the original
+ // name ArialBlack for example will be replaced by Helvetica.
+ this.black = (name.search(/Black/g) != -1);
+
+ this.encoding = properties.baseEncoding;
+ this.noUnicodeAdaptation = true;
+ this.loadedName = fontName.split('-')[0];
+ this.loading = false;
+ return;
+ }
+
+ var data;
+ switch (type) {
+ case 'Type1':
+ case 'CIDFontType0':
+ this.mimetype = 'font/opentype';
+
+ var subtype = properties.subtype;
+ var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
+ new Type2CFF(file, properties) : new CFF(name, file, properties);
+
+ // Wrap the CFF data inside an OTF font file
+ data = this.convert(name, cff, properties);
+ break;
+
+ case 'TrueType':
+ case 'CIDFontType2':
+ this.mimetype = 'font/opentype';
+
+ // Repair the TrueType file. It is can be damaged in the point of
+ // view of the sanitizer
+ data = this.checkAndRepair(name, file, properties);
+ break;
+
+ default:
+ warn('Font ' + properties.type + ' is not supported');
+ break;
+ }
+
+ this.data = data;
+ this.fontMatrix = properties.fontMatrix;
+ this.encoding = properties.baseEncoding;
+ this.hasShortCmap = properties.hasShortCmap;
+ this.loadedName = getUniqueName();
+ this.loading = true;
+ };
+
+ var numFonts = 0;
+ function getUniqueName() {
+ return 'pdfFont' + numFonts++;
+ }
+
+ function stringToArray(str) {
+ var array = [];
+ for (var i = 0, ii = str.length; i < ii; ++i)
+ array[i] = str.charCodeAt(i);
+
+ return array;
+ };
+
+ function arrayToString(arr) {
+ var str = '';
+ for (var i = 0, ii = arr.length; i < ii; ++i)
+ str += String.fromCharCode(arr[i]);
+
+ return str;
+ };
+
+ function int16(bytes) {
+ return (bytes[0] << 8) + (bytes[1] & 0xff);
+ };
+
+ function int32(bytes) {
+ return (bytes[0] << 24) + (bytes[1] << 16) +
+ (bytes[2] << 8) + (bytes[3] & 0xff);
+ };
+
+ function getMaxPower2(number) {
+ var maxPower = 0;
+ var value = number;
+ while (value >= 2) {
+ value /= 2;
+ maxPower++;
+ }
+
+ value = 2;
+ for (var i = 1; i < maxPower; i++)
+ value *= 2;
+ return value;
+ };
+
+ function string16(value) {
+ return String.fromCharCode((value >> 8) & 0xff) +
+ String.fromCharCode(value & 0xff);
+ };
+
+ function string32(value) {
+ return String.fromCharCode((value >> 24) & 0xff) +
+ String.fromCharCode((value >> 16) & 0xff) +
+ String.fromCharCode((value >> 8) & 0xff) +
+ String.fromCharCode(value & 0xff);
+ };
+
+ function createOpenTypeHeader(sfnt, file, numTables) {
+ // Windows hates the Mac TrueType sfnt version number
+ if (sfnt == 'true')
+ sfnt = string32(0x00010000);
+
+ // sfnt version (4 bytes)
+ var header = sfnt;
+
+ // numTables (2 bytes)
+ header += string16(numTables);
+
+ // searchRange (2 bytes)
+ var tablesMaxPower2 = getMaxPower2(numTables);
+ var searchRange = tablesMaxPower2 * 16;
+ header += string16(searchRange);
+
+ // entrySelector (2 bytes)
+ header += string16(Math.log(tablesMaxPower2) / Math.log(2));
+
+ // rangeShift (2 bytes)
+ header += string16(numTables * 16 - searchRange);
+
+ file.file += header;
+ file.virtualOffset += header.length;
+ };
+
+ function createTableEntry(file, tag, data) {
+ // offset
+ var offset = file.virtualOffset;
+
+ // length
+ var length = data.length;
+
+ // Per spec tables must be 4-bytes align so add padding as needed
+ while (data.length & 3)
+ data.push(0x00);
+
+ while (file.virtualOffset & 3)
+ file.virtualOffset++;
+
+ // checksum
+ var checksum = 0, n = data.length;
+ for (var i = 0; i < n; i += 4)
+ checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
+ data[i + 3]])) | 0;
+
+ var tableEntry = (tag + string32(checksum) +
+ string32(offset) + string32(length));
+ file.file += tableEntry;
+ file.virtualOffset += data.length;
+ };
+
+ function getRanges(glyphs) {
+ // Array.sort() sorts by characters, not numerically, so convert to an
+ // array of characters.
+ var codes = [];
+ var length = glyphs.length;
+ for (var n = 0; n < length; ++n)
+ codes.push({ unicode: glyphs[n].unicode, code: n });
+ codes.sort(function fontGetRangesSort(a, b) {
+ return a.unicode - b.unicode;
+ });
+
+ // Split the sorted codes into ranges.
+ var ranges = [];
+ for (var n = 0; n < length; ) {
+ var start = codes[n].unicode;
+ var startCode = codes[n].code;
+ ++n;
+ var end = start;
+ while (n < length && end + 1 == codes[n].unicode) {
+ ++end;
+ ++n;
+ }
+ var endCode = codes[n - 1].code;
+ ranges.push([start, end, startCode, endCode]);
+ }
+
+ return ranges;
+ };
+
+ function createCMapTable(glyphs, deltas) {
+ var ranges = getRanges(glyphs);
+
+ var numTables = 1;
+ var cmap = '\x00\x00' + // version
+ string16(numTables) + // numTables
+ '\x00\x03' + // platformID
+ '\x00\x01' + // encodingID
+ string32(4 + numTables * 8); // start of the table record
+
+ var segCount = ranges.length + 1;
+ var segCount2 = segCount * 2;
+ var searchRange = getMaxPower2(segCount) * 2;
+ var searchEntry = Math.log(segCount) / Math.log(2);
+ var rangeShift = 2 * segCount - searchRange;
+
+ // Fill up the 4 parallel arrays describing the segments.
+ var startCount = '';
+ var endCount = '';
+ var idDeltas = '';
+ var idRangeOffsets = '';
+ var glyphsIds = '';
+ var bias = 0;
+
+ if (deltas) {
+ for (var i = 0; i < segCount - 1; i++) {
+ var range = ranges[i];
+ var start = range[0];
+ var end = range[1];
+ var offset = (segCount - i) * 2 + bias * 2;
+ bias += (end - start + 1);
+
+ startCount += string16(start);
+ endCount += string16(end);
+ idDeltas += string16(0);
+ idRangeOffsets += string16(offset);
+
+ var startCode = range[2];
+ var endCode = range[3];
+ for (var j = startCode; j <= endCode; ++j)
+ glyphsIds += string16(deltas[j]);
+ }
+ } else {
+ for (var i = 0; i < segCount - 1; i++) {
+ var range = ranges[i];
+ var start = range[0];
+ var end = range[1];
+ var startCode = range[2];
+
+ startCount += string16(start);
+ endCount += string16(end);
+ idDeltas += string16((startCode - start + 1) & 0xFFFF);
+ idRangeOffsets += string16(0);
+ }
+ }
+
+ endCount += '\xFF\xFF';
+ startCount += '\xFF\xFF';
+ idDeltas += '\x00\x01';
+ idRangeOffsets += '\x00\x00';
+
+ var format314 = '\x00\x00' + // language
+ string16(segCount2) +
+ string16(searchRange) +
+ string16(searchEntry) +
+ string16(rangeShift) +
+ endCount + '\x00\x00' + startCount +
+ idDeltas + idRangeOffsets + glyphsIds;
+
+ return stringToArray(cmap +
+ '\x00\x04' + // format
+ string16(format314.length + 4) + // length
+ format314);
+ };
+
+ function createOS2Table(properties, charstrings, override) {
+ override = override || {
+ unitsPerEm: 0,
+ yMax: 0,
+ yMin: 0,
+ ascent: 0,
+ descent: 0
+ };
+
+ var ulUnicodeRange1 = 0;
+ var ulUnicodeRange2 = 0;
+ var ulUnicodeRange3 = 0;
+ var ulUnicodeRange4 = 0;
+
+ var firstCharIndex = null;
+ var lastCharIndex = 0;
+
+ if (charstrings) {
+ for (var i = 0; i < charstrings.length; ++i) {
+ var code = charstrings[i].unicode;
+ if (firstCharIndex > code || !firstCharIndex)
+ firstCharIndex = code;
+ if (lastCharIndex < code)
+ lastCharIndex = code;
+
+ var position = getUnicodeRangeFor(code);
+ if (position < 32) {
+ ulUnicodeRange1 |= 1 << position;
+ } else if (position < 64) {
+ ulUnicodeRange2 |= 1 << position - 32;
+ } else if (position < 96) {
+ ulUnicodeRange3 |= 1 << position - 64;
+ } else if (position < 123) {
+ ulUnicodeRange4 |= 1 << position - 96;
+ } else {
+ error('Unicode ranges Bits > 123 are reserved for internal usage');
+ }
+ }
+ } else {
+ // TODO
+ firstCharIndex = 0;
+ lastCharIndex = 255;
+ }
+
+ var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
+ var typoAscent = override.ascent || properties.ascent;
+ var typoDescent = override.descent || properties.descent;
+ var winAscent = override.yMax || typoAscent;
+ var winDescent = -override.yMin || -typoDescent;
+
+ // if there is a units per em value but no other override
+ // then scale the calculated ascent
+ if (unitsPerEm != kPDFGlyphSpaceUnits &&
+ 'undefined' == typeof(override.ascent)) {
+ // if the font units differ to the PDF glyph space units
+ // then scale up the values
+ typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
+ typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
+ winAscent = typoAscent;
+ winDescent = -typoDescent;
+ }
+
+ return '\x00\x03' + // version
+ '\x02\x24' + // xAvgCharWidth
+ '\x01\xF4' + // usWeightClass
+ '\x00\x05' + // usWidthClass
+ '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
+ '\x02\x8A' + // ySubscriptXSize
+ '\x02\xBB' + // ySubscriptYSize
+ '\x00\x00' + // ySubscriptXOffset
+ '\x00\x8C' + // ySubscriptYOffset
+ '\x02\x8A' + // ySuperScriptXSize
+ '\x02\xBB' + // ySuperScriptYSize
+ '\x00\x00' + // ySuperScriptXOffset
+ '\x01\xDF' + // ySuperScriptYOffset
+ '\x00\x31' + // yStrikeOutSize
+ '\x01\x02' + // yStrikeOutPosition
+ '\x00\x00' + // sFamilyClass
+ '\x00\x00\x06' +
+ String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
+ '\x00\x00\x00\x00\x00\x00' + // Panose
+ string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
+ string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
+ string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
+ string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
+ '\x2A\x32\x31\x2A' + // achVendID
+ string16(properties.italicAngle ? 1 : 0) + // fsSelection
+ string16(firstCharIndex ||
+ properties.firstChar) + // usFirstCharIndex
+ string16(lastCharIndex || properties.lastChar) + // usLastCharIndex
+ string16(typoAscent) + // sTypoAscender
+ string16(typoDescent) + // sTypoDescender
+ '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
+ string16(winAscent) + // usWinAscent
+ string16(winDescent) + // usWinDescent
+ '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
+ '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
+ string16(properties.xHeight) + // sxHeight
+ string16(properties.capHeight) + // sCapHeight
+ string16(0) + // usDefaultChar
+ string16(firstCharIndex || properties.firstChar) + // usBreakChar
+ '\x00\x03'; // usMaxContext
+ };
+
+ function createPostTable(properties) {
+ var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
+ return '\x00\x03\x00\x00' + // Version number
+ string32(angle) + // italicAngle
+ '\x00\x00' + // underlinePosition
+ '\x00\x00' + // underlineThickness
+ string32(properties.fixedPitch) + // isFixedPitch
+ '\x00\x00\x00\x00' + // minMemType42
+ '\x00\x00\x00\x00' + // maxMemType42
+ '\x00\x00\x00\x00' + // minMemType1
+ '\x00\x00\x00\x00'; // maxMemType1
+ };
+
+ function createNameTable(name) {
+ var strings = [
+ 'Original licence', // 0.Copyright
+ name, // 1.Font family
+ 'Unknown', // 2.Font subfamily (font weight)
+ 'uniqueID', // 3.Unique ID
+ name, // 4.Full font name
+ 'Version 0.11', // 5.Version
+ '', // 6.Postscript name
+ 'Unknown', // 7.Trademark
+ 'Unknown', // 8.Manufacturer
+ 'Unknown' // 9.Designer
+ ];
+
+ // Mac want 1-byte per character strings while Windows want
+ // 2-bytes per character, so duplicate the names table
+ var stringsUnicode = [];
+ for (var i = 0, ii = strings.length; i < ii; i++) {
+ var str = strings[i];
+
+ var strUnicode = '';
+ for (var j = 0, jj = str.length; j < jj; j++)
+ strUnicode += string16(str.charCodeAt(j));
+ stringsUnicode.push(strUnicode);
+ }
+
+ var names = [strings, stringsUnicode];
+ var platforms = ['\x00\x01', '\x00\x03'];
+ var encodings = ['\x00\x00', '\x00\x01'];
+ var languages = ['\x00\x00', '\x04\x09'];
+
+ var namesRecordCount = strings.length * platforms.length;
+ var nameTable =
+ '\x00\x00' + // format
+ string16(namesRecordCount) + // Number of names Record
+ string16(namesRecordCount * 12 + 6); // Storage
+
+ // Build the name records field
+ var strOffset = 0;
+ for (var i = 0, ii = platforms.length; i < ii; i++) {
+ var strs = names[i];
+ for (var j = 0, jj = strs.length; j < jj; j++) {
+ var str = strs[j];
+ var nameRecord =
+ platforms[i] + // platform ID
+ encodings[i] + // encoding ID
+ languages[i] + // language ID
+ string16(j) + // name ID
+ string16(str.length) +
+ string16(strOffset);
+ nameTable += nameRecord;
+ strOffset += str.length;
+ }
+ }
+
+ nameTable += strings.join('') + stringsUnicode.join('');
+ return nameTable;
+ }
+
+ constructor.prototype = {
+ name: null,
+ font: null,
+ mimetype: null,
+ encoding: null,
+
+ checkAndRepair: function font_checkAndRepair(name, font, properties) {
+ function readTableEntry(file) {
+ var tag = file.getBytes(4);
+ tag = String.fromCharCode(tag[0]) +
+ String.fromCharCode(tag[1]) +
+ String.fromCharCode(tag[2]) +
+ String.fromCharCode(tag[3]);
+
+ var checksum = int32(file.getBytes(4));
+ var offset = int32(file.getBytes(4));
+ var length = int32(file.getBytes(4));
+
+ // Read the table associated data
+ var previousPosition = file.pos;
+ file.pos = file.start ? file.start : 0;
+ file.skip(offset);
+ var data = file.getBytes(length);
+ file.pos = previousPosition;
+
+ if (tag == 'head') {
+ // clearing checksum adjustment
+ data[8] = data[9] = data[10] = data[11] = 0;
+ data[17] |= 0x20; //Set font optimized for cleartype flag
+ }
+
+ return {
+ tag: tag,
+ checksum: checksum,
+ length: length,
+ offset: offset,
+ data: data
+ };
+ };
+
+ function readOpenTypeHeader(ttf) {
+ return {
+ version: arrayToString(ttf.getBytes(4)),
+ numTables: int16(ttf.getBytes(2)),
+ searchRange: int16(ttf.getBytes(2)),
+ entrySelector: int16(ttf.getBytes(2)),
+ rangeShift: int16(ttf.getBytes(2))
+ };
+ };
+
+ function createGlyphNameMap(glyphs, ids, properties) {
+ var glyphNames = properties.glyphNames;
+ if (!glyphNames) {
+ properties.glyphNameMap = {};
+ return;
+ }
+ var glyphsLength = glyphs.length;
+ var glyphNameMap = {};
+ var encoding = [];
+ for (var i = 0; i < glyphsLength; ++i) {
+ var glyphName = glyphNames[ids[i]];
+ if (!glyphName)
+ continue;
+ var unicode = glyphs[i].unicode;
+ glyphNameMap[glyphName] = unicode;
+ var code = glyphs[i].code;
+ encoding[code] = glyphName;
+ }
+ properties.glyphNameMap = glyphNameMap;
+ if (!properties.hasEncoding)
+ properties.baseEncoding = encoding;
+ }
+
+ function replaceCMapTable(cmap, font, properties) {
+ var start = (font.start ? font.start : 0) + cmap.offset;
+ font.pos = start;
+
+ var version = int16(font.getBytes(2));
+ var numRecords = int16(font.getBytes(2));
+
+ var records = [];
+ for (var i = 0; i < numRecords; i++) {
+ records.push({
+ platformID: int16(font.getBytes(2)),
+ encodingID: int16(font.getBytes(2)),
+ offset: int32(font.getBytes(4))
+ });
+ }
+
+ // Check that table are sorted by platformID then encodingID,
+ records.sort(function fontReplaceCMapTableSort(a, b) {
+ return ((a.platformID << 16) + a.encodingID) -
+ ((b.platformID << 16) + b.encodingID);
+ });
+
+ var tables = [records[0]];
+ for (var i = 1; i < numRecords; i++) {
+ // The sanitizer will drop the font if 2 tables have the same
+ // platformID and the same encodingID, this will be correct for
+ // most cases but if the font has been made for Mac it could
+ // exist a few platformID: 1, encodingID: 0 but with a different
+ // language field and that's correct. But the sanitizer does not
+ // seem to support this case.
+ var current = records[i];
+ var previous = records[i - 1];
+ if (((current.platformID << 16) + current.encodingID) <=
+ ((previous.platformID << 16) + previous.encodingID))
+ continue;
+ tables.push(current);
+ }
+
+ var missing = numRecords - tables.length;
+ if (missing) {
+ numRecords = tables.length;
+ var data = string16(version) + string16(numRecords);
+
+ for (var i = 0; i < numRecords; i++) {
+ var table = tables[i];
+ data += string16(table.platformID) +
+ string16(table.encodingID) +
+ string32(table.offset);
+ }
+
+ for (var i = 0, ii = data.length; i < ii; i++)
+ cmap.data[i] = data.charCodeAt(i);
+ }
+
+ for (var i = 0; i < numRecords; i++) {
+ var table = tables[i];
+ font.pos = start + table.offset;
+
+ var format = int16(font.getBytes(2));
+ var length = int16(font.getBytes(2));
+ var language = int16(font.getBytes(2));
+
+ if (format == 0) {
+ // Characters below 0x20 are controls characters that are hardcoded
+ // into the platform so if some characters in the font are assigned
+ // under this limit they will not be displayed so let's rewrite the
+ // CMap.
+ var glyphs = [];
+ var ids = [];
+ for (var j = 0; j < 256; j++) {
+ var index = font.getByte();
+ if (index) {
+ var unicode = adaptUnicode(j);
+ glyphs.push({ unicode: unicode, code: j });
+ ids.push(index);
+ }
+ }
+
+ properties.hasShortCmap = true;
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ } else if (format == 4) {
+ // re-creating the table in format 4 since the encoding
+ // might be changed
+ var segCount = (int16(font.getBytes(2)) >> 1);
+ font.getBytes(6); // skipping range fields
+ var segIndex, segments = [];
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments.push({ end: int16(font.getBytes(2)) });
+ }
+ font.getBytes(2);
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].start = int16(font.getBytes(2));
+ }
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].delta = int16(font.getBytes(2));
+ }
+
+ var offsetsCount = 0;
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ var segment = segments[segIndex];
+ var rangeOffset = int16(font.getBytes(2));
+ if (!rangeOffset) {
+ segment.offsetIndex = -1;
+ continue;
+ }
+
+ var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+ segment.offsetIndex = offsetIndex;
+ offsetsCount = Math.max(offsetsCount, offsetIndex +
+ segment.end - segment.start + 1);
+ }
+
+ var offsets = [];
+ for (var j = 0; j < offsetsCount; j++)
+ offsets.push(int16(font.getBytes(2)));
+
+ var glyphs = [], ids = [];
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ var segment = segments[segIndex];
+ var start = segment.start, end = segment.end;
+ var delta = segment.delta, offsetIndex = segment.offsetIndex;
+
+ for (var j = start; j <= end; j++) {
+ if (j == 0xFFFF)
+ continue;
+
+ var glyphCode = offsetIndex < 0 ? j :
+ offsets[offsetIndex + j - start];
+ glyphCode = (glyphCode + delta) & 0xFFFF;
+ if (glyphCode == 0 || isAdaptedUnicode(j))
+ continue;
+
+ var unicode = adaptUnicode(j);
+ glyphs.push({ unicode: unicode, code: j });
+ ids.push(glyphCode);
+ }
+ }
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ } else if (format == 6) {
+ // Format 6 is a 2-bytes dense mapping, which means the font data
+ // lives glue together even if they are pretty far in the unicode
+ // table. (This looks weird, so I can have missed something), this
+ // works on Linux but seems to fails on Mac so let's rewrite the
+ // cmap table to a 3-1-4 style
+ var firstCode = int16(font.getBytes(2));
+ var entryCount = int16(font.getBytes(2));
+
+ var glyphs = [];
+ var ids = [];
+ for (var j = 0; j < entryCount; j++) {
+ var glyphCode = int16(font.getBytes(2));
+ var code = firstCode + j;
+ if (isAdaptedUnicode(glyphCode))
+ continue;
+
+ var unicode = adaptUnicode(code);
+ glyphs.push({ unicode: unicode, code: code });
+ ids.push(glyphCode);
+ }
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ }
+ }
+ return cmap.data;
+ };
+
+ function sanitizeMetrics(font, header, metrics, numGlyphs) {
+ if (!header && !metrics)
+ return;
+
+ // The vhea/vmtx tables are not required, so it happens that
+ // some fonts embed a vmtx table without a vhea table. In this
+ // situation the sanitizer assume numOfLongVerMetrics = 1. As
+ // a result it tries to read numGlyphs - 1 SHORT from the vmtx
+ // table, and if it is not possible, the font is rejected.
+ // So remove the vmtx table if there is no vhea table.
+ if (!header && metrics) {
+ metrics.data = null;
+ return;
+ }
+
+ font.pos = (font.start ? font.start : 0) + header.offset;
+ font.pos += header.length - 2;
+ var numOfMetrics = int16(font.getBytes(2));
+
+ var numOfSidebearings = numGlyphs - numOfMetrics;
+ var numMissing = numOfSidebearings -
+ ((hmtx.length - numOfMetrics * 4) >> 1);
+ if (numMissing > 0) {
+ font.pos = (font.start ? font.start : 0) + metrics.offset;
+ var entries = '';
+ for (var i = 0, ii = hmtx.length; i < ii; i++)
+ entries += String.fromCharCode(font.getByte());
+ for (var i = 0; i < numMissing; i++)
+ entries += '\x00\x00';
+ metrics.data = stringToArray(entries);
+ }
+ };
+
+ function sanitizeGlyphLocations(loca, glyf, numGlyphs,
+ isGlyphLocationsLong) {
+ var itemSize, itemDecode, itemEncode;
+ if (isGlyphLocationsLong) {
+ itemSize = 4;
+ itemDecode = function fontItemDecodeLong(data, offset) {
+ return (data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3];
+ };
+ itemEncode = function fontItemEncodeLong(data, offset, value) {
+ data[offset] = (value >>> 24) & 0xFF;
+ data[offset + 1] = (value >> 16) & 0xFF;
+ data[offset + 2] = (value >> 8) & 0xFF;
+ data[offset + 3] = value & 0xFF;
+ };
+ } else {
+ itemSize = 2;
+ itemDecode = function fontItemDecode(data, offset) {
+ return (data[offset] << 9) | (data[offset + 1] << 1);
+ };
+ itemEncode = function fontItemEncode(data, offset, value) {
+ data[offset] = (value >> 9) & 0xFF;
+ data[offset + 1] = (value >> 1) & 0xFF;
+ };
+ }
+ var locaData = loca.data;
+ var startOffset = itemDecode(locaData, 0);
+ var firstOffset = itemDecode(locaData, itemSize);
+ if (firstOffset - startOffset < 12 || startOffset > 0) {
+ // removing first glyph
+ glyf.data = glyf.data.subarray(firstOffset);
+ glyf.length -= firstOffset;
+
+ itemEncode(locaData, 0, 0);
+ var i, pos = itemSize;
+ for (i = 1; i <= numGlyphs; ++i) {
+ itemEncode(locaData, pos,
+ itemDecode(locaData, pos) - firstOffset);
+ pos += itemSize;
+ }
+ }
+ }
+
+ function readGlyphNameMap(post, properties) {
+ var start = (font.start ? font.start : 0) + post.offset;
+ font.pos = start;
+
+ var length = post.length, end = start + length;
+ var version = int32(font.getBytes(4));
+ // skip rest to the tables
+ font.getBytes(28);
+
+ var glyphNames;
+ switch (version) {
+ case 0x00010000:
+ glyphNames = MacStandardGlyphOrdering;
+ break;
+ case 0x00020000:
+ var numGlyphs = int16(font.getBytes(2));
+ var glyphNameIndexes = [];
+ for (var i = 0; i < numGlyphs; ++i)
+ glyphNameIndexes.push(int16(font.getBytes(2)));
+ var customNames = [];
+ while (font.pos < end) {
+ var stringLength = font.getByte();
+ var string = '';
+ for (var i = 0; i < stringLength; ++i)
+ string += font.getChar();
+ customNames.push(string);
+ }
+ glyphNames = [];
+ for (var i = 0; i < numGlyphs; ++i) {
+ var j = glyphNameIndexes[i];
+ if (j < 258) {
+ glyphNames.push(MacStandardGlyphOrdering[j]);
+ continue;
+ }
+ glyphNames.push(customNames[j - 258]);
+ }
+ break;
+ case 0x00030000:
+ break;
+ default:
+ warn('Unknown/unsupported post table version ' + version);
+ break;
+ }
+ properties.glyphNames = glyphNames;
+ }
+
+ // Check that required tables are present
+ var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
+ 'hmtx', 'maxp', 'name', 'post'];
+
+ var header = readOpenTypeHeader(font);
+ var numTables = header.numTables;
+
+ var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf;
+ var tables = [];
+ for (var i = 0; i < numTables; i++) {
+ var table = readTableEntry(font);
+ var index = requiredTables.indexOf(table.tag);
+ if (index != -1) {
+ if (table.tag == 'cmap')
+ cmap = table;
+ else if (table.tag == 'post')
+ post = table;
+ else if (table.tag == 'maxp')
+ maxp = table;
+ else if (table.tag == 'hhea')
+ hhea = table;
+ else if (table.tag == 'hmtx')
+ hmtx = table;
+ else if (table.tag == 'head')
+ head = table;
+
+ requiredTables.splice(index, 1);
+ } else {
+ if (table.tag == 'vmtx')
+ vmtx = table;
+ else if (table.tag == 'vhea')
+ vhea = table;
+ else if (table.tag == 'loca')
+ loca = table;
+ else if (table.tag == 'glyf')
+ glyf = table;
+ }
+ tables.push(table);
+ }
+
+ var numTables = header.numTables + requiredTables.length;
+
+ // header and new offsets. Table entry information is appended to the
+ // end of file. The virtualOffset represents where to put the actual
+ // data of a particular table;
+ var ttf = {
+ file: '',
+ virtualOffset: numTables * (4 * 4)
+ };
+
+ // The new numbers of tables will be the last one plus the num
+ // of missing tables
+ createOpenTypeHeader(header.version, ttf, numTables);
+
+ if (requiredTables.indexOf('OS/2') != -1) {
+ // extract some more font properties from the OpenType head and
+ // hhea tables; yMin and descent value are always negative
+ var override = {
+ unitsPerEm: int16([head.data[18], head.data[19]]),
+ yMax: int16([head.data[42], head.data[43]]),
+ yMin: int16([head.data[38], head.data[39]]) - 0x10000,
+ ascent: int16([hhea.data[4], hhea.data[5]]),
+ descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
+ };
+
+ tables.push({
+ tag: 'OS/2',
+ data: stringToArray(createOS2Table(properties, null, override))
+ });
+ }
+
+ // Ensure the [h/v]mtx tables contains the advance width and
+ // sidebearings information for numGlyphs in the maxp table
+ font.pos = (font.start || 0) + maxp.offset;
+ var version = int16(font.getBytes(4));
+ var numGlyphs = int16(font.getBytes(2));
+
+ sanitizeMetrics(font, hhea, hmtx, numGlyphs);
+ sanitizeMetrics(font, vhea, vmtx, numGlyphs);
+
+ if (head && loca && glyf) {
+ var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
+ sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
+ }
+
+ // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
+ // Sometimes it's 0. That needs to be fixed
+ if (hhea.data[10] == 0 && hhea.data[11] == 0) {
+ hhea.data[10] = 0xFF;
+ hhea.data[11] = 0xFF;
+ }
+
+ // The 'post' table has glyphs names.
+ if (post) {
+ readGlyphNameMap(post, properties);
+ }
+
+ // Replace the old CMAP table with a shiny new one
+ if (properties.type == 'CIDFontType2') {
+ // Type2 composite fonts map characters directly to glyphs so the cmap
+ // table must be replaced.
+ // canvas fillText will reencode some characters even if the font has a
+ // glyph at that position - e.g. newline is converted to a space and
+ // U+00AD (soft hyphen) is not drawn.
+ // So, offset all the glyphs by 0xFF to avoid these cases and use
+ // the encoding to map incoming characters to the new glyph positions
+ if (!cmap) {
+ cmap = {
+ tag: 'cmap',
+ data: null
+ };
+ tables.push(cmap);
+ }
+
+ var glyphs = [];
+ for (i = 1; i < numGlyphs; i++) {
+ if (isAdaptedUnicode(i))
+ continue;
+
+ glyphs.push({ unicode: adaptUnicode(i) });
+ }
+ cmap.data = createCMapTable(glyphs);
+ } else {
+ replaceCMapTable(cmap, font, properties);
+ this.glyphNameMap = properties.glyphNameMap;
+ }
+
+ // Rewrite the 'post' table if needed
+ if (requiredTables.indexOf('post') != -1) {
+ tables.push({
+ tag: 'post',
+ data: stringToArray(createPostTable(properties))
+ });
+ }
+
+ // Rewrite the 'name' table if needed
+ if (requiredTables.indexOf('name') != -1) {
+ tables.push({
+ tag: 'name',
+ data: stringToArray(createNameTable(this.name))
+ });
+ }
+
+ // Tables needs to be written by ascendant alphabetic order
+ tables.sort(function tables_sort(a, b) {
+ return (a.tag > b.tag) - (a.tag < b.tag);
+ });
+
+ // rewrite the tables but tweak offsets
+ for (var i = 0, ii = tables.length; i < ii; i++) {
+ var table = tables[i];
+ var data = [];
+
+ var tableData = table.data;
+ for (var j = 0, jj = tableData.length; j < jj; j++)
+ data.push(tableData[j]);
+ createTableEntry(ttf, table.tag, data);
+ }
+
+ // Add the table datas
+ for (var i = 0, ii = tables.length; i < ii; i++) {
+ var table = tables[i];
+ var tableData = table.data;
+ ttf.file += arrayToString(tableData);
+
+ // 4-byte aligned data
+ while (ttf.file.length & 3)
+ ttf.file += String.fromCharCode(0);
+ }
+
+ return stringToArray(ttf.file);
+ },
+
+ convert: function font_convert(fontName, font, properties) {
+ function isFixedPitch(glyphs) {
+ for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
+ if (glyphs[i] != glyphs[i + 1])
+ return false;
+ }
+ return true;
+ }
+
+ // The offsets object holds at the same time a representation of where
+ // to write the table entry information about a table and another offset
+ // representing the offset where to draw the actual data of a particular
+ // table
+ var kRequiredTablesCount = 9;
+
+ var otf = {
+ file: '',
+ virtualOffset: 9 * (4 * 4)
+ };
+
+ createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
+
+ var charstrings = font.charstrings;
+ properties.fixedPitch = isFixedPitch(charstrings);
+
+ var glyphNameMap = {};
+ for (var i = 0; i < charstrings.length; ++i) {
+ var charstring = charstrings[i];
+ glyphNameMap[charstring.glyph] = charstring.unicode;
+ }
+ this.glyphNameMap = glyphNameMap;
+
+ if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
+ properties.subtype == 'CIDFontType0C')) {
+ var encoding = [];
+ for (var i = 0; i < charstrings.length; ++i) {
+ var charstring = charstrings[i];
+ encoding[charstring.code] = charstring.glyph;
+ }
+ properties.baseEncoding = encoding;
+ }
+
+ var fields = {
+ // PostScript Font Program
+ 'CFF ': font.data,
+
+ // OS/2 and Windows Specific metrics
+ 'OS/2': stringToArray(createOS2Table(properties, charstrings)),
+
+ // Character to glyphs mapping
+ 'cmap': createCMapTable(charstrings.slice(),
+ ('glyphIds' in font) ? font.glyphIds : null),
+
+ // Font header
+ 'head': (function fontFieldsHead() {
+ return stringToArray(
+ '\x00\x01\x00\x00' + // Version number
+ '\x00\x00\x10\x00' + // fontRevision
+ '\x00\x00\x00\x00' + // checksumAdjustement
+ '\x5F\x0F\x3C\xF5' + // magicNumber
+ '\x00\x00' + // Flags
+ '\x03\xE8' + // unitsPerEM (defaulting to 1000)
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
+ '\x00\x00' + // xMin
+ string16(properties.descent) + // yMin
+ '\x0F\xFF' + // xMax
+ string16(properties.ascent) + // yMax
+ string16(properties.italicAngle ? 2 : 0) + // macStyle
+ '\x00\x11' + // lowestRecPPEM
+ '\x00\x00' + // fontDirectionHint
+ '\x00\x00' + // indexToLocFormat
+ '\x00\x00'); // glyphDataFormat
+ })(),
+
+ // Horizontal header
+ 'hhea': (function fontFieldsHhea() {
+ return stringToArray(
+ '\x00\x01\x00\x00' + // Version number
+ string16(properties.ascent) + // Typographic Ascent
+ string16(properties.descent) + // Typographic Descent
+ '\x00\x00' + // Line Gap
+ '\xFF\xFF' + // advanceWidthMax
+ '\x00\x00' + // minLeftSidebearing
+ '\x00\x00' + // minRightSidebearing
+ '\x00\x00' + // xMaxExtent
+ string16(properties.capHeight) + // caretSlopeRise
+ string16(Math.tan(properties.italicAngle) *
+ properties.xHeight) + // caretSlopeRun
+ '\x00\x00' + // caretOffset
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // metricDataFormat
+ string16(charstrings.length + 1)); // Number of HMetrics
+ })(),
+
+ // Horizontal metrics
+ 'hmtx': (function fontFieldsHmtx() {
+ var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
+ for (var i = 0, ii = charstrings.length; i < ii; i++)
+ hmtx += string16(charstrings[i].width) + string16(0);
+ return stringToArray(hmtx);
+ })(),
+
+ // Maximum profile
+ 'maxp': (function fontFieldsMaxp() {
+ return stringToArray(
+ '\x00\x00\x50\x00' + // Version number
+ string16(charstrings.length + 1)); // Num of glyphs
+ })(),
+
+ // Naming tables
+ 'name': stringToArray(createNameTable(fontName)),
+
+ // PostScript informations
+ 'post': stringToArray(createPostTable(properties))
+ };
+
+ for (var field in fields)
+ createTableEntry(otf, field, fields[field]);
+
+ for (var field in fields) {
+ var table = fields[field];
+ otf.file += arrayToString(table);
+ }
+
+ return stringToArray(otf.file);
+ },
+
+ loadCidToUnicode: function font_loadCidToUnicode(properties) {
+ if (properties.cidToGidMap) {
+ this.cidToUnicode = properties.cidToGidMap;
+ return;
+ }
+
+ if (!properties.cidSystemInfo)
+ return;
+
+ var cidToUnicodeMap = [];
+ this.cidToUnicode = cidToUnicodeMap;
+
+ var cidSystemInfo = properties.cidSystemInfo;
+ var cidToUnicode;
+ if (cidSystemInfo) {
+ cidToUnicode = CIDToUnicodeMaps[
+ cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
+ }
+
+ if (!cidToUnicode)
+ return; // identity encoding
+
+ var glyph = 1, i, j, k, ii;
+ for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
+ var unicode = cidToUnicode[i];
+ if (isArray(unicode)) {
+ var length = unicode.length;
+ for (j = 0; j < length; j++)
+ cidToUnicodeMap[unicode[j]] = glyph;
+ glyph++;
+ } else if (typeof unicode === 'object') {
+ var fillLength = unicode.f;
+ if (fillLength) {
+ k = unicode.c;
+ for (j = 0; j < fillLength; ++j) {
+ cidToUnicodeMap[k] = glyph++;
+ k++;
+ }
+ } else
+ glyph += unicode.s;
+ } else if (unicode) {
+ cidToUnicodeMap[unicode] = glyph++;
+ } else
+ glyph++;
+ }
+ },
+
+ bindWorker: function font_bindWorker(data) {
+ postMessage({
+ action: 'font',
+ data: {
+ raw: data,
+ fontName: this.loadedName,
+ mimetype: this.mimetype
+ }
+ });
+ },
+
+ bindDOM: function font_bindDom(data) {
+ var fontName = this.loadedName;
+
+ // Add the font-face rule to the document
+ var url = ('url(data:' + this.mimetype + ';base64,' +
+ window.btoa(data) + ');');
+ var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
+
+ document.documentElement.firstChild.appendChild(
+ document.createElement('style'));
+
+ var styleSheet = document.styleSheets[document.styleSheets.length - 1];
+ styleSheet.insertRule(rule, styleSheet.cssRules.length);
+
+ return rule;
+ },
+
+ charToGlyph: function fonts_charToGlyph(charcode) {
+ var unicode, width, codeIRQueue;
+
+ var width = this.widths[charcode];
+
+ switch (this.type) {
+ case 'CIDFontType0':
+ if (this.noUnicodeAdaptation) {
+ width = this.widths[this.cidToUnicode[charcode]];
+ unicode = charcode;
+ break;
+ }
+ unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode);
+ break;
+ case 'CIDFontType2':
+ if (this.noUnicodeAdaptation) {
+ width = this.widths[this.cidToUnicode[charcode]];
+ unicode = charcode;
+ break;
+ }
+ unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode);
+ break;
+ case 'Type1':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ if (this.noUnicodeAdaptation) {
+ if (!isNum(width))
+ width = this.widths[glyphName];
+ unicode = GlyphsUnicode[glyphName] || charcode;
+ break;
+ }
+ unicode = this.glyphNameMap[glyphName] ||
+ adaptUnicode(GlyphsUnicode[glyphName] || charcode);
+ break;
+ case 'Type3':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ codeIRQueue = this.charProcIRQueues[glyphName];
+ unicode = charcode;
+ break;
+ case 'TrueType':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ if (!glyphName)
+ glyphName = Encodings.StandardEncoding[charcode];
+ if (!isNum(width))
+ width = this.widths[glyphName];
+ if (this.noUnicodeAdaptation) {
+ unicode = GlyphsUnicode[glyphName] || charcode;
+ break;
+ }
+ if (!this.hasEncoding) {
+ unicode = adaptUnicode(charcode);
+ break;
+ }
+ if (this.hasShortCmap) {
+ var j = Encodings.MacRomanEncoding.indexOf(glyphName);
+ unicode = j >= 0 && !isSpecialUnicode(j) ? j :
+ this.glyphNameMap[glyphName];
+ } else {
+ unicode = glyphName in GlyphsUnicode ?
+ adaptUnicode(GlyphsUnicode[glyphName]) :
+ this.glyphNameMap[glyphName];
+ }
+ break;
+ default:
+ warn('Unsupported font type: ' + this.type);
+ break;
+ }
+ return {
+ unicode: unicode,
+ width: isNum(width) ? width : this.defaultWidth,
+ codeIRQueue: codeIRQueue
+ };
+ },
+
+ charsToGlyphs: function fonts_chars2Glyphs(chars) {
+ var charsCache = this.charsCache;
+ var glyphs;
+
+ // if we translated this string before, just grab it from the cache
+ if (charsCache) {
+ glyphs = charsCache[chars];
+ if (glyphs)
+ return glyphs;
+ }
+
+ // lazily create the translation cache
+ if (!charsCache)
+ charsCache = this.charsCache = Object.create(null);
+
+ glyphs = [];
+
+ if (this.composite) {
+ // composite fonts have multi-byte strings convert the string from
+ // single-byte to multi-byte
+ // XXX assuming CIDFonts are two-byte - later need to extract the
+ // correct byte encoding according to the PDF spec
+ var length = chars.length - 1; // looping over two bytes at a time so
+ // loop should never end on the last byte
+ for (var i = 0; i < length; i++) {
+ var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
+ var glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ // placing null after each word break charcode (ASCII SPACE)
+ if (charcode == 0x20)
+ glyphs.push(null);
+ }
+ }
+ else {
+ for (var i = 0, ii = chars.length; i < ii; ++i) {
+ var charcode = chars.charCodeAt(i);
+ var glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ if (charcode == 0x20)
+ glyphs.push(null);
+ }
+ }
+
+ // Enter the translated string into the cache
+ return (charsCache[chars] = glyphs);
+ }
+ };
+
+ return constructor;
+})();
+
+/*
+ * Type1Parser encapsulate the needed code for parsing a Type1 font
+ * program. Some of its logic depends on the Type2 charstrings
+ * structure.
+ */
+var Type1Parser = function type1Parser() {
+ /*
+ * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
+ * of Plaintext Bytes. The function took a key as a parameter which can be
+ * for decrypting the eexec block of for decoding charStrings.
+ */
+ var kEexecEncryptionKey = 55665;
+ var kCharStringsEncryptionKey = 4330;
+
+ function decrypt(stream, key, discardNumber) {
+ var r = key, c1 = 52845, c2 = 22719;
+ var decryptedString = [];
+
+ var value = '';
+ var count = stream.length;
+ for (var i = 0; i < count; i++) {
+ value = stream[i];
+ decryptedString[i] = value ^ (r >> 8);
+ r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+ }
+ return decryptedString.slice(discardNumber);
+ }
+
+ /*
+ * CharStrings are encoded following the the CharString Encoding sequence
+ * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
+ * The value in a byte indicates a command, a number, or subsequent bytes
+ * that are to be interpreted in a special way.
+ *
+ * CharString Number Encoding:
+ * A CharString byte containing the values from 32 through 255 inclusive
+ * indicate an integer. These values are decoded in four ranges.
+ *
+ * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
+ * indicate the integer v - 139. Thus, the integer values from -107 through
+ * 107 inclusive may be encoded in single byte.
+ *
+ * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * [(v - 247) x 256] + w + 108
+ *
+ * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * -[(v - 251) * 256] - w - 108
+ *
+ * 4. A CharString containing the value 255 indicates that the next 4 bytes
+ * are a two complement signed integer. The first of these bytes contains the
+ * highest order bits, the second byte contains the next higher order bits
+ * and the fourth byte contain the lowest order bits.
+ *
+ *
+ * CharString Command Encoding:
+ * CharStrings commands are encoded in 1 or 2 bytes.
+ *
+ * Single byte commands are encoded in 1 byte that contains a value between
+ * 0 and 31 inclusive.
+ * If a command byte contains the value 12, then the value in the next byte
+ * indicates a command. This "escape" mechanism allows many extra commands
+ * to be encoded and this encoding technique helps to minimize the length of
+ * the charStrings.
+ */
+ var charStringDictionary = {
+ '1': 'hstem',
+ '3': 'vstem',
+ '4': 'vmoveto',
+ '5': 'rlineto',
+ '6': 'hlineto',
+ '7': 'vlineto',
+ '8': 'rrcurveto',
+
+ // closepath is a Type1 command that do not take argument and is useless
+ // in Type2 and it can simply be ignored.
+ '9': null, // closepath
+
+ '10': 'callsubr',
+
+ // return is normally used inside sub-routines to tells to the execution
+ // flow that it can be back to normal.
+ // During the translation process Type1 charstrings will be flattened and
+ // sub-routines will be embedded directly into the charstring directly, so
+ // this can be ignored safely.
+ '11': 'return',
+
+ '12': {
+ // dotsection is a Type1 command to specify some hinting feature for dots
+ // that do not take a parameter and it can safely be ignored for Type2.
+ '0': null, // dotsection
+
+ // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
+ // parameters, so instead of returning [vh]stem3 take a shortcut and
+ // return [vhstem] instead.
+ '1': 'vstem',
+ '2': 'hstem',
+
+ // Type1 only command with command not (yet) built-in ,throw an error
+ '6': -1, // seac
+ '7': -1, // sbw
+
+ '11': 'sub',
+ '12': 'div',
+
+ // callothersubr is a mechanism to make calls on the postscript
+ // interpreter, this is not supported by Type2 charstring but hopefully
+ // most of the default commands can be ignored safely.
+ '16': 'callothersubr',
+
+ '17': 'pop',
+
+ // setcurrentpoint sets the current point to x, y without performing a
+ // moveto (this is a one shot positionning command). This is used only
+ // with the return of an OtherSubrs call.
+ // TODO Implement the OtherSubrs charstring embedding and replace this
+ // call by a no-op, like 2 'pop' commands for example.
+ '33': null // setcurrentpoint
+ },
+ '13': 'hsbw',
+ '14': 'endchar',
+ '21': 'rmoveto',
+ '22': 'hmoveto',
+ '30': 'vhcurveto',
+ '31': 'hvcurveto'
+ };
+
+ var kEscapeCommand = 12;
+
+ function decodeCharString(array) {
+ var charstring = [];
+ var lsb = 0;
+ var width = 0;
+ var flexState = 0;
+
+ var value = '';
+ var count = array.length;
+ for (var i = 0; i < count; i++) {
+ value = array[i];
+
+ if (value < 32) {
+ var command = null;
+ if (value == kEscapeCommand) {
+ var escape = array[++i];
+
+ // TODO Clean this code
+ if (escape == 16) {
+ var index = charstring.pop();
+ var argc = charstring.pop();
+ for (var j = 0; j < argc; j++)
+ charstring.push('drop');
+
+ // If the flex mechanism is not used in a font program, Adobe
+ // states that entries 0, 1 and 2 can simply be replaced by
+ // {}, which means that we can simply ignore them.
+ if (index < 3) {
+ continue;
+ }
+
+ // This is the same things about hint replacement, if it is not used
+ // entry 3 can be replaced by {3}
+ // TODO support hint replacment
+ if (index == 3) {
+ charstring.push(3);
+ i++;
+ continue;
+ }
+ } else if (escape == 17 || escape == 33) {
+ // pop or setcurrentpoint commands can be ignored
+ // since we are not doing callothersubr
+ continue;
+ } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
+ charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
+ continue;
+ }
+
+ command = charStringDictionary['12'][escape];
+ } else {
+ // TODO Clean this code
+ if (value == 13) { // hsbw
+ if (charstring.length == 2) {
+ lsb = charstring[0];
+ width = charstring[1];
+ charstring.splice(0, 1);
+ } else if (charstring.length == 4 && charstring[3] == 'div') {
+ lsb = charstring[0];
+ width = charstring[1] / charstring[2];
+ charstring.splice(0, 1);
+ } else if (charstring.length == 4 && charstring[2] == 'div') {
+ lsb = charstring[0] / charstring[1];
+ width = charstring[3];
+ charstring.splice(0, 3);
+ } else {
+ error('Unsupported hsbw format: ' + charstring);
+ }
+
+ charstring.push(lsb, 'hmoveto');
+ continue;
+ } else if (value == 10) { // callsubr
+ if (charstring[charstring.length - 1] < 3) { // subr #0..2
+ var subrNumber = charstring.pop();
+ switch (subrNumber) {
+ case 1:
+ flexState = 1; // prepare for flex coordinates
+ break;
+ case 2:
+ flexState = 2; // flex in progress
+ break;
+ case 0:
+ // type2 flex command does not need final coords
+ charstring.push('exch', 'drop', 'exch', 'drop');
+ charstring.push('flex');
+ flexState = 0;
+ break;
+ }
+ continue;
+ }
+ } else if (value == 21 && flexState > 0) {
+ if (flexState > 1)
+ continue; // ignoring rmoveto
+ value = 5; // first segment replacing with rlineto
+ } else if (!kHintingEnabled && (value == 1 || value == 3)) {
+ charstring.push('drop', 'drop');
+ continue;
+ }
+ command = charStringDictionary[value];
+ }
+
+ // Some charstring commands are meaningless in Type2 and will return
+ // a null, let's just ignored them
+ if (!command && i < count) {
+ continue;
+ } else if (!command) {
+ break;
+ } else if (command == -1) {
+ warn('Support for Type1 command ' + value +
+ ' (' + escape + ') is not implemented in charstring: ' +
+ charstring);
+ if (value == 12) {
+ // we know how to ignore only some the Type1 commands
+ switch (escape) {
+ case 7:
+ charstring.push('drop', 'drop', 'drop', 'drop');
+ continue;
+ case 8:
+ charstring.push('drop');
+ continue;
+ }
+ }
+ }
+
+ value = command;
+ } else if (value <= 246) {
+ value = value - 139;
+ } else if (value <= 250) {
+ value = ((value - 247) * 256) + array[++i] + 108;
+ } else if (value <= 254) {
+ value = -((value - 251) * 256) - array[++i] - 108;
+ } else {
+ value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
+ (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
+ }
+
+ charstring.push(value);
+ }
+
+ return { charstring: charstring, width: width, lsb: lsb };
+ }
+
+ /*
+ * Returns an object containing a Subrs array and a CharStrings
+ * array extracted from and eexec encrypted block of data
+ */
+ function readNumberArray(str, index) {
+ var start = index;
+ while (str[index++] != '[')
+ start++;
+ start++;
+
+ var count = 0;
+ while (str[index++] != ']')
+ count++;
+
+ var array = str.substr(start, count).split(' ');
+ for (var i = 0, ii = array.length; i < ii; i++)
+ array[i] = parseFloat(array[i] || 0);
+ return array;
+ }
+
+ function readNumber(str, index) {
+ while (str[index] == ' ')
+ index++;
+
+ var start = index;
+
+ var count = 0;
+ while (str[index++] != ' ')
+ count++;
+
+ return parseFloat(str.substr(start, count) || 0);
+ }
+
+ function isSeparator(c) {
+ return c == ' ' || c == '\n' || c == '\x0d';
+ }
+
+ this.extractFontProgram = function t1_extractFontProgram(stream) {
+ var eexec = decrypt(stream, kEexecEncryptionKey, 4);
+ var eexecStr = '';
+ for (var i = 0, ii = eexec.length; i < ii; i++)
+ eexecStr += String.fromCharCode(eexec[i]);
+
+ var glyphsSection = false, subrsSection = false;
+ var program = {
+ subrs: [],
+ charstrings: [],
+ properties: {
+ 'private': {
+ 'lenIV': 4
+ }
+ }
+ };
+
+ var glyph = '';
+ var token = '';
+ var length = 0;
+
+ var c = '';
+ var count = eexecStr.length;
+ for (var i = 0; i < count; i++) {
+ var getToken = function getToken() {
+ while (i < count && isSeparator(eexecStr[i]))
+ ++i;
+
+ var token = '';
+ while (i < count && !isSeparator(eexecStr[i]))
+ token += eexecStr[i++];
+
+ return token;
+ };
+ var c = eexecStr[i];
+
+ if ((glyphsSection || subrsSection) &&
+ (token == 'RD' || token == '-|')) {
+ i++;
+ var data = eexec.slice(i, i + length);
+ var lenIV = program.properties.private['lenIV'];
+ var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+ var str = decodeCharString(encoded);
+
+ if (glyphsSection) {
+ program.charstrings.push({
+ glyph: glyph,
+ data: str.charstring,
+ lsb: str.lsb,
+ width: str.width
+ });
+ } else {
+ program.subrs.push(str.charstring);
+ }
+ i += length;
+ token = '';
+ } else if (isSeparator(c)) {
+ length = parseInt(token, 10);
+ token = '';
+ } else {
+ token += c;
+ if (!glyphsSection) {
+ switch (token) {
+ case '/CharString':
+ glyphsSection = true;
+ break;
+ case '/Subrs':
+ ++i;
+ var num = parseInt(getToken(), 10);
+ getToken(); // read in 'array'
+ for (var j = 0; j < num; ++j) {
+ var t = getToken(); // read in 'dup'
+ if (t == 'ND' || t == '|-' || t == 'noaccess')
+ break;
+ var index = parseInt(getToken(), 10);
+ if (index > j)
+ j = index;
+ var length = parseInt(getToken(), 10);
+ getToken(); // read in 'RD'
+ var data = eexec.slice(i + 1, i + 1 + length);
+ var lenIV = program.properties.private['lenIV'];
+ var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+ var str = decodeCharString(encoded);
+ i = i + 1 + length;
+ t = getToken(); // read in 'NP'
+ if (t == 'noaccess')
+ getToken(); // read in 'put'
+ program.subrs[index] = str.charstring;
+ }
+ break;
+ case '/BlueValues':
+ case '/OtherBlues':
+ case '/FamilyBlues':
+ case '/FamilyOtherBlues':
+ case '/StemSnapH':
+ case '/StemSnapV':
+ program.properties.private[token.substring(1)] =
+ readNumberArray(eexecStr, i + 1);
+ break;
+ case '/StdHW':
+ case '/StdVW':
+ program.properties.private[token.substring(1)] =
+ readNumberArray(eexecStr, i + 2)[0];
+ break;
+ case '/BlueShift':
+ case '/lenIV':
+ case '/BlueFuzz':
+ case '/BlueScale':
+ case '/LanguageGroup':
+ case '/ExpansionFactor':
+ program.properties.private[token.substring(1)] =
+ readNumber(eexecStr, i + 1);
+ break;
+ }
+ } else if (c == '/') {
+ token = glyph = '';
+ while ((c = eexecStr[++i]) != ' ')
+ glyph += c;
+ }
+ }
+ }
+
+ return program;
+ };
+
+ this.extractFontHeader = function t1_extractFontHeader(stream, properties) {
+ var headerString = '';
+ for (var i = 0, ii = stream.length; i < ii; i++)
+ headerString += String.fromCharCode(stream[i]);
+
+ var token = '';
+ var count = headerString.length;
+ for (var i = 0; i < count; i++) {
+ var getToken = function getToken() {
+ var char = headerString[i];
+ while (i < count && (isSeparator(char) || char == '/'))
+ char = headerString[++i];
+
+ var token = '';
+ while (i < count && !(isSeparator(char) || char == '/')) {
+ token += char;
+ char = headerString[++i];
+ }
+
+ return token;
+ };
+
+ var c = headerString[i];
+ if (isSeparator(c)) {
+ switch (token) {
+ case '/FontMatrix':
+ var matrix = readNumberArray(headerString, i + 1);
+
+ // The FontMatrix is in unitPerEm, so make it pixels
+ for (var j = 0, jj = matrix.length; j < jj; j++)
+ matrix[j] *= 1000;
+
+ // Make the angle into the right direction
+ matrix[2] *= -1;
+
+ properties.fontMatrix = matrix;
+ break;
+ case '/Encoding':
+ var encodingArg = getToken();
+ var encoding;
+ if (!/^\d+$/.test(encodingArg)) {
+ // encoding name is specified
+ encoding = Encodings[encodingArg];
+ } else {
+ encoding = [];
+ var size = parseInt(encodingArg, 10);
+ getToken(); // read in 'array'
+
+ for (var j = 0; j < size; j++) {
+ var token = getToken();
+ if (token == 'dup') {
+ var index = parseInt(getToken(), 10);
+ var glyph = getToken();
+ encoding[index] = glyph;
+ getToken(); // read the in 'put'
+ }
+ }
+ }
+ if (!properties.hasEncoding && encoding) {
+ properties.baseEncoding = encoding;
+ break;
+ }
+ break;
+ }
+ token = '';
+ } else {
+ token += c;
+ }
+ }
+ };
+};
+
+/**
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
+ */
+var CFFStrings = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
+ 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+ 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
+ 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
+ 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+ 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
+ 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
+ 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
+ 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
+ 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
+ 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
+ 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
+ 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
+ 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
+ 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
+ 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
+ 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
+ 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
+ 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
+ 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
+ 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
+ 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+ 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
+ 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+ 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+ 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
+ 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
+ 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
+ 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+ 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
+ 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
+ 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
+ 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
+ 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+ 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
+ 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
+ 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
+ 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
+ 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
+ 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
+ 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
+ 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
+ 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
+ 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
+ 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
+ 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
+ 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
+];
+
+var type1Parser = new Type1Parser();
+
+var CFF = function cffCFF(name, file, properties) {
+ // Get the data block containing glyphs and subrs informations
+ var headerBlock = file.getBytes(properties.length1);
+ type1Parser.extractFontHeader(headerBlock, properties);
+
+ // Decrypt the data blocks and retrieve it's content
+ var eexecBlock = file.getBytes(properties.length2);
+ var data = type1Parser.extractFontProgram(eexecBlock);
+ for (var info in data.properties)
+ properties[info] = data.properties[info];
+
+ var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
+ var type2Charstrings = this.getType2Charstrings(charstrings);
+ var subrs = this.getType2Subrs(data.subrs);
+
+ this.charstrings = charstrings;
+ this.data = this.wrap(name, type2Charstrings, this.charstrings,
+ subrs, properties);
+};
+
+CFF.prototype = {
+ createCFFIndexHeader: function cff_createCFFIndexHeader(objects, isByte) {
+ // First 2 bytes contains the number of objects contained into this index
+ var count = objects.length;
+
+ // If there is no object, just create an array saying that with another
+ // offset byte.
+ if (count == 0)
+ return '\x00\x00\x00';
+
+ var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
+
+ // Next byte contains the offset size use to reference object in the file
+ // Actually we're using 0x04 to be sure to be able to store everything
+ // without thinking of it while coding.
+ data += '\x04';
+
+ // Add another offset after this one because we need a new offset
+ var relativeOffset = 1;
+ for (var i = 0; i < count + 1; i++) {
+ data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
+ (relativeOffset >> 16) & 0xFF,
+ (relativeOffset >> 8) & 0xFF,
+ relativeOffset & 0xFF);
+
+ if (objects[i])
+ relativeOffset += objects[i].length;
+ }
+
+ for (var i = 0; i < count; i++) {
+ for (var j = 0, jj = objects[i].length; j < jj; j++)
+ data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
+ objects[i][j];
+ }
+ return data;
+ },
+
+ encodeNumber: function cff_encodeNumber(value) {
+ // some of the fonts has ouf-of-range values
+ // they are just arithmetic overflows
+ // make sanitizer happy
+ value |= 0;
+ if (value >= -32768 && value <= 32767) {
+ return '\x1c' +
+ String.fromCharCode((value >> 8) & 0xFF) +
+ String.fromCharCode(value & 0xFF);
+ } else {
+ return '\x1d' +
+ String.fromCharCode((value >> 24) & 0xFF) +
+ String.fromCharCode((value >> 16) & 0xFF) +
+ String.fromCharCode((value >> 8) & 0xFF) +
+ String.fromCharCode(value & 0xFF);
+ }
+ },
+
+ getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs,
+ properties) {
+ var charstrings = [];
+ var reverseMapping = {};
+ var encoding = properties.baseEncoding;
+ var i, length, glyphName;
+ for (i = 0, length = encoding.length; i < length; ++i) {
+ glyphName = encoding[i];
+ if (!glyphName || isSpecialUnicode(i))
+ continue;
+ reverseMapping[glyphName] = i;
+ }
+ reverseMapping['.notdef'] = 0;
+ var unusedUnicode = kCmapGlyphOffset;
+ for (i = 0, length = glyphs.length; i < length; i++) {
+ var item = glyphs[i];
+ var glyphName = item.glyph;
+ var unicode = glyphName in reverseMapping ?
+ reverseMapping[glyphName] : unusedUnicode++;
+ charstrings.push({
+ glyph: glyphName,
+ unicode: unicode,
+ gid: i,
+ charstring: item.data,
+ width: item.width,
+ lsb: item.lsb
+ });
+ }
+
+ charstrings.sort(function charstrings_sort(a, b) {
+ return a.unicode - b.unicode;
+ });
+ return charstrings;
+ },
+
+ getType2Charstrings: function cff_getType2Charstrings(type1Charstrings) {
+ var type2Charstrings = [];
+ var count = type1Charstrings.length;
+ for (var i = 0; i < count; i++) {
+ var charstring = type1Charstrings[i].charstring;
+ type2Charstrings.push(this.flattenCharstring(charstring.slice(),
+ this.commandsMap));
+ }
+ return type2Charstrings;
+ },
+
+ getType2Subrs: function cff_getType2Subrs(type1Subrs) {
+ var bias = 0;
+ var count = type1Subrs.length;
+ if (count < 1240)
+ bias = 107;
+ else if (count < 33900)
+ bias = 1131;
+ else
+ bias = 32768;
+
+ // Add a bunch of empty subrs to deal with the Type2 bias
+ var type2Subrs = [];
+ for (var i = 0; i < bias; i++)
+ type2Subrs.push([0x0B]);
+
+ for (var i = 0; i < count; i++) {
+ var subr = type1Subrs[i];
+ if (!subr)
+ subr = [0x0B];
+
+ type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
+ }
+
+ return type2Subrs;
+ },
+
+ /*
+ * Flatten the commands by interpreting the postscript code and replacing
+ * every 'callsubr', 'callothersubr' by the real commands.
+ */
+ commandsMap: {
+ 'hstem': 1,
+ 'vstem': 3,
+ 'vmoveto': 4,
+ 'rlineto': 5,
+ 'hlineto': 6,
+ 'vlineto': 7,
+ 'rrcurveto': 8,
+ 'callsubr': 10,
+ 'return': 11,
+ 'sub': [12, 11],
+ 'div': [12, 12],
+ 'exch': [12, 28],
+ 'flex': [12, 35],
+ 'drop' : [12, 18],
+ 'endchar': 14,
+ 'rmoveto': 21,
+ 'hmoveto': 22,
+ 'vhcurveto': 30,
+ 'hvcurveto': 31
+ },
+
+ flattenCharstring: function flattenCharstring(charstring, map) {
+ // charstring changes size - can't cache .length in loop
+ for (var i = 0; i < charstring.length; i++) {
+ var command = charstring[i];
+ if (command.charAt) {
+ var cmd = map[command];
+ assert(cmd, 'Unknow command: ' + command);
+
+ if (isArray(cmd))
+ charstring.splice(i++, 1, cmd[0], cmd[1]);
+ else
+ charstring[i] = cmd;
+ } else {
+ // Type1 charstring use a division for number above 32000
+ if (command > 32000) {
+ var divisor = charstring[i + 1];
+ command /= divisor;
+ charstring.splice(i, 3, 28, command >> 8, command & 0xff);
+ } else {
+ charstring.splice(i, 1, 28, command >> 8, command & 0xff);
+ }
+ i += 2;
+ }
+ }
+ return charstring;
+ },
+
+ wrap: function wrap(name, glyphs, charstrings, subrs, properties) {
+ var fields = {
+ // major version, minor version, header size, offset size
+ 'header': '\x01\x00\x04\x04',
+
+ 'names': this.createCFFIndexHeader([name]),
+
+ 'topDict': (function topDict(self) {
+ return function cffWrapTopDict() {
+ var header = '\x00\x01\x01\x01';
+ var dict =
+ '\xf8\x1b\x00' + // version
+ '\xf8\x1c\x01' + // Notice
+ '\xf8\x1d\x02' + // FullName
+ '\xf8\x1e\x03' + // FamilyName
+ '\xf8\x1f\x04' + // Weight
+ '\x1c\x00\x00\x10'; // Encoding
+
+ var boundingBox = properties.bbox;
+ for (var i = 0, ii = boundingBox.length; i < ii; i++)
+ dict += self.encodeNumber(boundingBox[i]);
+ dict += '\x05'; // FontBBox;
+
+ var offset = fields.header.length +
+ fields.names.length +
+ (header.length + 1) +
+ (dict.length + (4 + 4)) +
+ fields.strings.length +
+ fields.globalSubrs.length;
+
+ // If the offset if over 32767, encodeNumber is going to return
+ // 5 bytes to encode the position instead of 3.
+ if ((offset + fields.charstrings.length) > 32767) {
+ offset += 9;
+ } else {
+ offset += 7;
+ }
+
+ dict += self.encodeNumber(offset) + '\x0f'; // Charset
+
+ offset = offset + (glyphs.length * 2) + 1;
+ dict += self.encodeNumber(offset) + '\x11'; // Charstrings
+
+ offset = offset + fields.charstrings.length;
+ dict += self.encodeNumber(fields.private.length);
+ dict += self.encodeNumber(offset) + '\x12'; // Private
+
+ return header + String.fromCharCode(dict.length + 1) + dict;
+ };
+ })(this),
+
+ 'strings': (function strings(self) {
+ var strings = [
+ 'Version 0.11', // Version
+ 'See original notice', // Notice
+ name, // FullName
+ name, // FamilyName
+ 'Medium' // Weight
+ ];
+ return self.createCFFIndexHeader(strings);
+ })(this),
+
+ 'globalSubrs': this.createCFFIndexHeader([]),
+
+ 'charset': (function charset(self) {
+ var charsetString = '\x00'; // Encoding
+
+ var count = glyphs.length;
+ for (var i = 0; i < count; i++) {
+ var index = CFFStrings.indexOf(charstrings[i].glyph);
+ // Some characters like asterikmath && circlecopyrt are
+ // missing from the original strings, for the moment let's
+ // map them to .notdef and see later if it cause any
+ // problems
+ if (index == -1)
+ index = 0;
+
+ charsetString += String.fromCharCode(index >> 8, index & 0xff);
+ }
+ return charsetString;
+ })(this),
+
+ 'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
+ true),
+
+ 'private': (function cffWrapPrivate(self) {
+ var data =
+ '\x8b\x14' + // defaultWidth
+ '\x8b\x15'; // nominalWidth
+ var fieldMap = {
+ BlueValues: '\x06',
+ OtherBlues: '\x07',
+ FamilyBlues: '\x08',
+ FamilyOtherBlues: '\x09',
+ StemSnapH: '\x0c\x0c',
+ StemSnapV: '\x0c\x0d',
+ BlueShift: '\x0c\x0a',
+ BlueFuzz: '\x0c\x0b',
+ BlueScale: '\x0c\x09',
+ LanguageGroup: '\x0c\x11',
+ ExpansionFactor: '\x0c\x18'
+ };
+ for (var field in fieldMap) {
+ if (!properties.private.hasOwnProperty(field))
+ continue;
+ var value = properties.private[field];
+
+ if (isArray(value)) {
+ data += self.encodeNumber(value[0]);
+ for (var i = 1, ii = value.length; i < ii; i++)
+ data += self.encodeNumber(value[i] - value[i - 1]);
+ } else {
+ data += self.encodeNumber(value);
+ }
+ data += fieldMap[field];
+ }
+
+ data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
+
+ return data;
+ })(this),
+
+ 'localSubrs': this.createCFFIndexHeader(subrs, true)
+ };
+ fields.topDict = fields.topDict();
+
+
+ var cff = [];
+ for (var index in fields) {
+ var field = fields[index];
+ for (var i = 0, ii = field.length; i < ii; i++)
+ cff.push(field.charCodeAt(i));
+ }
+
+ return cff;
+ }
+};
+
+var Type2CFF = (function type2CFF() {
+ // TODO: replace parsing code with the Type2Parser in font_utils.js
+ function constructor(file, properties) {
+ var bytes = file.getBytes();
+ this.bytes = bytes;
+ this.properties = properties;
+
+ this.data = this.parse();
+ }
+
+ constructor.prototype = {
+ parse: function cff_parse() {
+ var header = this.parseHeader();
+ var properties = this.properties;
+ var nameIndex = this.parseIndex(header.endPos);
+
+ var dictIndex = this.parseIndex(nameIndex.endPos);
+ if (dictIndex.length != 1)
+ error('CFF contains more than 1 font');
+
+ var stringIndex = this.parseIndex(dictIndex.endPos);
+ var gsubrIndex = this.parseIndex(stringIndex.endPos);
+
+ var strings = this.getStrings(stringIndex);
+
+ var baseDict = this.parseDict(dictIndex.get(0).data);
+ var topDict = this.getTopDict(baseDict, strings);
+
+ var bytes = this.bytes;
+
+ var privateDict = {};
+ var privateInfo = topDict.Private;
+ if (privateInfo) {
+ var privOffset = privateInfo[1], privLength = privateInfo[0];
+ var privBytes = bytes.subarray(privOffset, privOffset + privLength);
+ baseDict = this.parseDict(privBytes);
+ privateDict = this.getPrivDict(baseDict, strings);
+ } else {
+ privateDict.defaultWidthX = properties.defaultWidth;
+ }
+
+ var charStrings = this.parseIndex(topDict.CharStrings);
+ var charset = this.parseCharsets(topDict.charset,
+ charStrings.length, strings);
+ var encoding = this.parseEncoding(topDict.Encoding, properties,
+ strings, charset);
+
+ var charset, encoding;
+ var isCIDFont = properties.subtype == 'CIDFontType0C';
+ if (isCIDFont) {
+ charset = [];
+ charset.length = charStrings.length;
+ encoding = this.parseCidMap(topDict.charset,
+ charStrings.length);
+ } else {
+ charset = this.parseCharsets(topDict.charset,
+ charStrings.length, strings);
+ encoding = this.parseEncoding(topDict.Encoding, properties,
+ strings, charset);
+ }
+
+ // The font sanitizer does not support CFF encoding with a
+ // supplement, since the encoding is not really use to map
+ // between gid to glyph, let's overwrite what is declared in
+ // the top dictionary to let the sanitizer think the font use
+ // StandardEncoding, that's a lie but that's ok.
+ if (encoding.hasSupplement)
+ bytes[topDict.Encoding] &= 0x7F;
+
+ // The CFF specification state that the 'dotsection' command
+ // (12, 0) is deprecated and treated as a no-op, but all Type2
+ // charstrings processors should support them. Unfortunately
+ // the font sanitizer don't. As a workaround the sequence (12, 0)
+ // is replaced by a useless (0, hmoveto).
+ var count = charStrings.length;
+ for (var i = 0; i < count; i++) {
+ var charstring = charStrings.get(i);
+
+ var start = charstring.start;
+ var data = charstring.data;
+ var length = data.length;
+ for (var j = 0; j <= length; j) {
+ var value = data[j++];
+ if (value == 12 && data[j++] == 0) {
+ bytes[start + j - 2] = 139;
+ bytes[start + j - 1] = 22;
+ } else if (value === 28) {
+ j += 2;
+ } else if (value >= 247 && value <= 254) {
+ j++;
+ } else if (value == 255) {
+ j += 4;
+ }
+ }
+ }
+
+ // charstrings contains info about glyphs (one element per glyph
+ // containing mappings for {unicode, width})
+ var charstrings = this.getCharStrings(charset, encoding.encoding,
+ privateDict, this.properties);
+
+ // create the mapping between charstring and glyph id
+ var glyphIds = [];
+ for (var i = 0, ii = charstrings.length; i < ii; i++)
+ glyphIds.push(charstrings[i].gid);
+
+ this.charstrings = charstrings;
+ this.glyphIds = glyphIds;
+
+ var data = [];
+ for (var i = 0, ii = bytes.length; i < ii; ++i)
+ data.push(bytes[i]);
+ return data;
+ },
+
+ getCharStrings: function cff_charstrings(charsets, encoding,
+ privateDict, properties) {
+ var charstrings = [];
+ var unicodeUsed = [];
+ var unassignedUnicodeItems = [];
+ for (var i = 0, ii = charsets.length; i < ii; i++) {
+ var glyph = charsets[i];
+ var encodingFound = false;
+ for (var charcode in encoding) {
+ if (encoding[charcode] == i) {
+ var code = charcode | 0;
+ charstrings.push({
+ unicode: adaptUnicode(code),
+ code: code,
+ gid: i,
+ glyph: glyph
+ });
+ unicodeUsed[code] = true;
+ encodingFound = true;
+ break;
+ }
+ }
+ if (!encodingFound) {
+ unassignedUnicodeItems.push(i);
+ }
+ }
+
+ var nextUnusedUnicode = 0x21;
+ for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
+ var i = unassignedUnicodeItems[j];
+ // giving unicode value anyway
+ while (unicodeUsed[nextUnusedUnicode])
+ nextUnusedUnicode++;
+ var code = nextUnusedUnicode++;
+ charstrings.push({
+ unicode: adaptUnicode(code),
+ code: code,
+ gid: i,
+ glyph: charsets[i]
+ });
+ }
+
+ // sort the array by the unicode value (again)
+ charstrings.sort(function type2CFFGetCharStringsSort(a, b) {
+ return a.unicode - b.unicode;
+ });
+ return charstrings;
+ },
+
+ parseEncoding: function cff_parseencoding(pos, properties, strings,
+ charset) {
+ var encoding = {};
+ var bytes = this.bytes;
+ var result = {
+ encoding: encoding,
+ hasSupplement: false
+ };
+
+ function readSupplement() {
+ var supplementsCount = bytes[pos++];
+ for (var i = 0; i < supplementsCount; i++) {
+ var code = bytes[pos++];
+ var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+ encoding[code] = properties.differences.indexOf(strings[sid]);
+ }
+ }
+
+ if (pos == 0 || pos == 1) {
+ var gid = 1;
+ var baseEncoding = pos ? Encodings.ExpertEncoding :
+ Encodings.StandardEncoding;
+ for (var i = 0, ii = charset.length; i < ii; i++) {
+ var index = baseEncoding.indexOf(charset[i]);
+ if (index != -1)
+ encoding[index] = gid++;
+ }
+ } else {
+ var format = bytes[pos++];
+ switch (format & 0x7f) {
+ case 0:
+ var glyphsCount = bytes[pos++];
+ for (var i = 1; i <= glyphsCount; i++)
+ encoding[bytes[pos++]] = i;
+ break;
+
+ case 1:
+ var rangesCount = bytes[pos++];
+ var gid = 1;
+ for (var i = 0; i < rangesCount; i++) {
+ var start = bytes[pos++];
+ var left = bytes[pos++];
+ for (var j = start; j <= start + left; j++)
+ encoding[j] = gid++;
+ }
+ break;
+
+ default:
+ error('Unknow encoding format: ' + format + ' in CFF');
+ break;
+ }
+ if (format & 0x80) {
+ readSupplement();
+ result.hasSupplement = true;
+ }
+ }
+ return result;
+ },
+
+ parseCharsets: function cff_parsecharsets(pos, length, strings) {
+ if (pos == 0) {
+ return ISOAdobeCharset.slice();
+ } else if (pos == 1) {
+ return ExpertCharset.slice();
+ } else if (pos == 2) {
+ return ExpertSubsetCharset.slice();
+ }
+
+ var bytes = this.bytes;
+ var format = bytes[pos++];
+ var charset = ['.notdef'];
+
+ // subtract 1 for the .notdef glyph
+ length -= 1;
+
+ switch (format) {
+ case 0:
+ for (var i = 0; i < length; i++) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ charset.push(strings[sid]);
+ }
+ break;
+ case 1:
+ while (charset.length <= length) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ charset.push(strings[sid++]);
+ }
+ break;
+ case 2:
+ while (charset.length <= length) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = (bytes[pos++] << 8) | bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ charset.push(strings[sid++]);
+ }
+ break;
+ default:
+ error('Unknown charset format');
+ }
+ return charset;
+ },
+
+ parseCidMap: function cff_parsecharsets(pos, length) {
+ var bytes = this.bytes;
+ var format = bytes[pos++];
+
+ var encoding = {};
+ var map = {encoding: encoding};
+
+ encoding[0] = 0;
+
+ var gid = 1;
+ switch (format) {
+ case 0:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ encoding[cid] = gid++;
+ }
+ break;
+ case 1:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ encoding[cid++] = gid++;
+ }
+ break;
+ case 2:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = (bytes[pos++] << 8) | bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ encoding[cid++] = gid++;
+ }
+ break;
+ default:
+ error('Unknown charset format');
+ }
+ return map;
+ },
+
+ getPrivDict: function cff_getprivdict(baseDict, strings) {
+ var dict = {};
+
+ // default values
+ dict['defaultWidthX'] = 0;
+ dict['nominalWidthX'] = 0;
+
+ for (var i = 0, ii = baseDict.length; i < ii; ++i) {
+ var pair = baseDict[i];
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 20:
+ dict['defaultWidthX'] = value[0];
+ case 21:
+ dict['nominalWidthX'] = value[0];
+ default:
+ TODO('interpret top dict key: ' + key);
+ }
+ }
+ return dict;
+ },
+ getTopDict: function cff_gettopdict(baseDict, strings) {
+ var dict = {};
+
+ // default values
+ dict['Encoding'] = 0;
+ dict['charset'] = 0;
+
+ for (var i = 0, ii = baseDict.length; i < ii; ++i) {
+ var pair = baseDict[i];
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 1:
+ dict['Notice'] = strings[value[0]];
+ break;
+ case 4:
+ dict['Weight'] = strings[value[0]];
+ break;
+ case 3094:
+ dict['BaseFontName'] = strings[value[0]];
+ break;
+ case 5:
+ dict['FontBBox'] = value;
+ break;
+ case 13:
+ dict['UniqueID'] = value[0];
+ break;
+ case 15:
+ dict['charset'] = value[0];
+ break;
+ case 16:
+ dict['Encoding'] = value[0];
+ break;
+ case 17:
+ dict['CharStrings'] = value[0];
+ break;
+ case 18:
+ dict['Private'] = value;
+ break;
+ case 3102:
+ case 3103:
+ case 3104:
+ case 3105:
+ case 3106:
+ case 3107:
+ case 3108:
+ case 3109:
+ case 3110:
+ dict['cidOperatorPresent'] = true;
+ break;
+ default:
+ TODO('interpret top dict key');
+ }
+ }
+ return dict;
+ },
+ getStrings: function cff_getStrings(stringIndex) {
+ function bytesToString(bytesArray) {
+ var str = '';
+ for (var i = 0, ii = bytesArray.length; i < ii; i++)
+ str += String.fromCharCode(bytesArray[i]);
+ return str;
+ }
+
+ var stringArray = [];
+ for (var i = 0, ii = CFFStrings.length; i < ii; i++)
+ stringArray.push(CFFStrings[i]);
+
+ for (var i = 0, ii = stringIndex.length; i < ii; i++)
+ stringArray.push(bytesToString(stringIndex.get(i).data));
+
+ return stringArray;
+ },
+ parseHeader: function cff_parseHeader() {
+ var bytes = this.bytes;
+ var offset = 0;
+
+ while (bytes[offset] != 1)
+ ++offset;
+
+ if (offset != 0) {
+ warning('cff data is shifted');
+ bytes = bytes.subarray(offset);
+ this.bytes = bytes;
+ }
+
+ return {
+ endPos: bytes[2],
+ offsetSize: bytes[3]
+ };
+ },
+ parseDict: function cff_parseDict(dict) {
+ var pos = 0;
+
+ function parseOperand() {
+ var value = dict[pos++];
+ if (value === 30) {
+ return parseFloatOperand(pos);
+ } else if (value === 28) {
+ value = dict[pos++];
+ value = (value << 8) | dict[pos++];
+ return value;
+ } else if (value === 29) {
+ value = dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ return value;
+ } else if (value <= 246) {
+ return value - 139;
+ } else if (value <= 250) {
+ return ((value - 247) * 256) + dict[pos++] + 108;
+ } else if (value <= 254) {
+ return -((value - 251) * 256) - dict[pos++] - 108;
+ } else {
+ error('255 is not a valid DICT command');
+ }
+ return -1;
+ }
+
+ function parseFloatOperand() {
+ var str = '';
+ var eof = 15;
+ var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', '.', 'E', 'E-', null, '-'];
+ var length = dict.length;
+ while (pos < length) {
+ var b = dict[pos++];
+ var b1 = b >> 4;
+ var b2 = b & 15;
+
+ if (b1 == eof)
+ break;
+ str += lookup[b1];
+
+ if (b2 == eof)
+ break;
+ str += lookup[b2];
+ }
+ return parseFloat(str);
+ }
+
+ var operands = [];
+ var entries = [];
+
+ var pos = 0;
+ var end = dict.length;
+ while (pos < end) {
+ var b = dict[pos];
+ if (b <= 21) {
+ if (b === 12) {
+ ++pos;
+ var op = dict[pos];
+ if ((op > 14 && op < 17) ||
+ (op > 23 && op < 30) || op > 38) {
+ warn('Invalid CFF dictionary key: ' + op);
+ // trying to replace it with initialRandomSeed
+ // to pass sanitizer
+ dict[pos] = 19;
+ }
+ var b = (b << 8) | op;
+ }
+ if (!operands.length && b == 8 &&
+ dict[pos + 1] == 9) {
+ // no operands for FamilyBlues, removing the key
+ // and next one is FamilyOtherBlues - skipping them
+ // also replacing FamilyBlues to pass sanitizer
+ dict[pos] = 139;
+ pos += 2;
+ continue;
+ }
+ entries.push([b, operands]);
+ operands = [];
+ ++pos;
+ } else {
+ operands.push(parseOperand());
+ }
+ }
+ return entries;
+ },
+ parseIndex: function cff_parseIndex(pos) {
+ var bytes = this.bytes;
+ var count = bytes[pos++] << 8 | bytes[pos++];
+ var offsets = [];
+ var end = pos;
+
+ if (count != 0) {
+ var offsetSize = bytes[pos++];
+ // add 1 for offset to determine size of last object
+ var startPos = pos + ((count + 1) * offsetSize) - 1;
+
+ for (var i = 0, ii = count + 1; i < ii; ++i) {
+ var offset = 0;
+ for (var j = 0; j < offsetSize; ++j) {
+ offset <<= 8;
+ offset += bytes[pos++];
+ }
+ offsets.push(startPos + offset);
+ }
+ end = offsets[count];
+ }
+
+ return {
+ get: function index_get(index) {
+ if (index >= count)
+ return null;
+
+ var start = offsets[index];
+ var end = offsets[index + 1];
+ return {
+ start: start,
+ end: end,
+ data: bytes.subarray(start, end)
+ };
+ },
+ length: count,
+ endPos: end
+ };
+ }
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var GlyphsUnicode = {
+ A: 0x0041,
+ AE: 0x00C6,
+ AEacute: 0x01FC,
+ AEmacron: 0x01E2,
+ AEsmall: 0xF7E6,
+ Aacute: 0x00C1,
+ Aacutesmall: 0xF7E1,
+ Abreve: 0x0102,
+ Abreveacute: 0x1EAE,
+ Abrevecyrillic: 0x04D0,
+ Abrevedotbelow: 0x1EB6,
+ Abrevegrave: 0x1EB0,
+ Abrevehookabove: 0x1EB2,
+ Abrevetilde: 0x1EB4,
+ Acaron: 0x01CD,
+ Acircle: 0x24B6,
+ Acircumflex: 0x00C2,
+ Acircumflexacute: 0x1EA4,
+ Acircumflexdotbelow: 0x1EAC,
+ Acircumflexgrave: 0x1EA6,
+ Acircumflexhookabove: 0x1EA8,
+ Acircumflexsmall: 0xF7E2,
+ Acircumflextilde: 0x1EAA,
+ Acute: 0xF6C9,
+ Acutesmall: 0xF7B4,
+ Acyrillic: 0x0410,
+ Adblgrave: 0x0200,
+ Adieresis: 0x00C4,
+ Adieresiscyrillic: 0x04D2,
+ Adieresismacron: 0x01DE,
+ Adieresissmall: 0xF7E4,
+ Adotbelow: 0x1EA0,
+ Adotmacron: 0x01E0,
+ Agrave: 0x00C0,
+ Agravesmall: 0xF7E0,
+ Ahookabove: 0x1EA2,
+ Aiecyrillic: 0x04D4,
+ Ainvertedbreve: 0x0202,
+ Alpha: 0x0391,
+ Alphatonos: 0x0386,
+ Amacron: 0x0100,
+ Amonospace: 0xFF21,
+ Aogonek: 0x0104,
+ Aring: 0x00C5,
+ Aringacute: 0x01FA,
+ Aringbelow: 0x1E00,
+ Aringsmall: 0xF7E5,
+ Asmall: 0xF761,
+ Atilde: 0x00C3,
+ Atildesmall: 0xF7E3,
+ Aybarmenian: 0x0531,
+ B: 0x0042,
+ Bcircle: 0x24B7,
+ Bdotaccent: 0x1E02,
+ Bdotbelow: 0x1E04,
+ Becyrillic: 0x0411,
+ Benarmenian: 0x0532,
+ Beta: 0x0392,
+ Bhook: 0x0181,
+ Blinebelow: 0x1E06,
+ Bmonospace: 0xFF22,
+ Brevesmall: 0xF6F4,
+ Bsmall: 0xF762,
+ Btopbar: 0x0182,
+ C: 0x0043,
+ Caarmenian: 0x053E,
+ Cacute: 0x0106,
+ Caron: 0xF6CA,
+ Caronsmall: 0xF6F5,
+ Ccaron: 0x010C,
+ Ccedilla: 0x00C7,
+ Ccedillaacute: 0x1E08,
+ Ccedillasmall: 0xF7E7,
+ Ccircle: 0x24B8,
+ Ccircumflex: 0x0108,
+ Cdot: 0x010A,
+ Cdotaccent: 0x010A,
+ Cedillasmall: 0xF7B8,
+ Chaarmenian: 0x0549,
+ Cheabkhasiancyrillic: 0x04BC,
+ Checyrillic: 0x0427,
+ Chedescenderabkhasiancyrillic: 0x04BE,
+ Chedescendercyrillic: 0x04B6,
+ Chedieresiscyrillic: 0x04F4,
+ Cheharmenian: 0x0543,
+ Chekhakassiancyrillic: 0x04CB,
+ Cheverticalstrokecyrillic: 0x04B8,
+ Chi: 0x03A7,
+ Chook: 0x0187,
+ Circumflexsmall: 0xF6F6,
+ Cmonospace: 0xFF23,
+ Coarmenian: 0x0551,
+ Csmall: 0xF763,
+ D: 0x0044,
+ DZ: 0x01F1,
+ DZcaron: 0x01C4,
+ Daarmenian: 0x0534,
+ Dafrican: 0x0189,
+ Dcaron: 0x010E,
+ Dcedilla: 0x1E10,
+ Dcircle: 0x24B9,
+ Dcircumflexbelow: 0x1E12,
+ Dcroat: 0x0110,
+ Ddotaccent: 0x1E0A,
+ Ddotbelow: 0x1E0C,
+ Decyrillic: 0x0414,
+ Deicoptic: 0x03EE,
+ Delta: 0x2206,
+ Deltagreek: 0x0394,
+ Dhook: 0x018A,
+ Dieresis: 0xF6CB,
+ DieresisAcute: 0xF6CC,
+ DieresisGrave: 0xF6CD,
+ Dieresissmall: 0xF7A8,
+ Digammagreek: 0x03DC,
+ Djecyrillic: 0x0402,
+ Dlinebelow: 0x1E0E,
+ Dmonospace: 0xFF24,
+ Dotaccentsmall: 0xF6F7,
+ Dslash: 0x0110,
+ Dsmall: 0xF764,
+ Dtopbar: 0x018B,
+ Dz: 0x01F2,
+ Dzcaron: 0x01C5,
+ Dzeabkhasiancyrillic: 0x04E0,
+ Dzecyrillic: 0x0405,
+ Dzhecyrillic: 0x040F,
+ E: 0x0045,
+ Eacute: 0x00C9,
+ Eacutesmall: 0xF7E9,
+ Ebreve: 0x0114,
+ Ecaron: 0x011A,
+ Ecedillabreve: 0x1E1C,
+ Echarmenian: 0x0535,
+ Ecircle: 0x24BA,
+ Ecircumflex: 0x00CA,
+ Ecircumflexacute: 0x1EBE,
+ Ecircumflexbelow: 0x1E18,
+ Ecircumflexdotbelow: 0x1EC6,
+ Ecircumflexgrave: 0x1EC0,
+ Ecircumflexhookabove: 0x1EC2,
+ Ecircumflexsmall: 0xF7EA,
+ Ecircumflextilde: 0x1EC4,
+ Ecyrillic: 0x0404,
+ Edblgrave: 0x0204,
+ Edieresis: 0x00CB,
+ Edieresissmall: 0xF7EB,
+ Edot: 0x0116,
+ Edotaccent: 0x0116,
+ Edotbelow: 0x1EB8,
+ Efcyrillic: 0x0424,
+ Egrave: 0x00C8,
+ Egravesmall: 0xF7E8,
+ Eharmenian: 0x0537,
+ Ehookabove: 0x1EBA,
+ Eightroman: 0x2167,
+ Einvertedbreve: 0x0206,
+ Eiotifiedcyrillic: 0x0464,
+ Elcyrillic: 0x041B,
+ Elevenroman: 0x216A,
+ Emacron: 0x0112,
+ Emacronacute: 0x1E16,
+ Emacrongrave: 0x1E14,
+ Emcyrillic: 0x041C,
+ Emonospace: 0xFF25,
+ Encyrillic: 0x041D,
+ Endescendercyrillic: 0x04A2,
+ Eng: 0x014A,
+ Enghecyrillic: 0x04A4,
+ Enhookcyrillic: 0x04C7,
+ Eogonek: 0x0118,
+ Eopen: 0x0190,
+ Epsilon: 0x0395,
+ Epsilontonos: 0x0388,
+ Ercyrillic: 0x0420,
+ Ereversed: 0x018E,
+ Ereversedcyrillic: 0x042D,
+ Escyrillic: 0x0421,
+ Esdescendercyrillic: 0x04AA,
+ Esh: 0x01A9,
+ Esmall: 0xF765,
+ Eta: 0x0397,
+ Etarmenian: 0x0538,
+ Etatonos: 0x0389,
+ Eth: 0x00D0,
+ Ethsmall: 0xF7F0,
+ Etilde: 0x1EBC,
+ Etildebelow: 0x1E1A,
+ Euro: 0x20AC,
+ Ezh: 0x01B7,
+ Ezhcaron: 0x01EE,
+ Ezhreversed: 0x01B8,
+ F: 0x0046,
+ Fcircle: 0x24BB,
+ Fdotaccent: 0x1E1E,
+ Feharmenian: 0x0556,
+ Feicoptic: 0x03E4,
+ Fhook: 0x0191,
+ Fitacyrillic: 0x0472,
+ Fiveroman: 0x2164,
+ Fmonospace: 0xFF26,
+ Fourroman: 0x2163,
+ Fsmall: 0xF766,
+ G: 0x0047,
+ GBsquare: 0x3387,
+ Gacute: 0x01F4,
+ Gamma: 0x0393,
+ Gammaafrican: 0x0194,
+ Gangiacoptic: 0x03EA,
+ Gbreve: 0x011E,
+ Gcaron: 0x01E6,
+ Gcedilla: 0x0122,
+ Gcircle: 0x24BC,
+ Gcircumflex: 0x011C,
+ Gcommaaccent: 0x0122,
+ Gdot: 0x0120,
+ Gdotaccent: 0x0120,
+ Gecyrillic: 0x0413,
+ Ghadarmenian: 0x0542,
+ Ghemiddlehookcyrillic: 0x0494,
+ Ghestrokecyrillic: 0x0492,
+ Gheupturncyrillic: 0x0490,
+ Ghook: 0x0193,
+ Gimarmenian: 0x0533,
+ Gjecyrillic: 0x0403,
+ Gmacron: 0x1E20,
+ Gmonospace: 0xFF27,
+ Grave: 0xF6CE,
+ Gravesmall: 0xF760,
+ Gsmall: 0xF767,
+ Gsmallhook: 0x029B,
+ Gstroke: 0x01E4,
+ H: 0x0048,
+ H18533: 0x25CF,
+ H18543: 0x25AA,
+ H18551: 0x25AB,
+ H22073: 0x25A1,
+ HPsquare: 0x33CB,
+ Haabkhasiancyrillic: 0x04A8,
+ Hadescendercyrillic: 0x04B2,
+ Hardsigncyrillic: 0x042A,
+ Hbar: 0x0126,
+ Hbrevebelow: 0x1E2A,
+ Hcedilla: 0x1E28,
+ Hcircle: 0x24BD,
+ Hcircumflex: 0x0124,
+ Hdieresis: 0x1E26,
+ Hdotaccent: 0x1E22,
+ Hdotbelow: 0x1E24,
+ Hmonospace: 0xFF28,
+ Hoarmenian: 0x0540,
+ Horicoptic: 0x03E8,
+ Hsmall: 0xF768,
+ Hungarumlaut: 0xF6CF,
+ Hungarumlautsmall: 0xF6F8,
+ Hzsquare: 0x3390,
+ I: 0x0049,
+ IAcyrillic: 0x042F,
+ IJ: 0x0132,
+ IUcyrillic: 0x042E,
+ Iacute: 0x00CD,
+ Iacutesmall: 0xF7ED,
+ Ibreve: 0x012C,
+ Icaron: 0x01CF,
+ Icircle: 0x24BE,
+ Icircumflex: 0x00CE,
+ Icircumflexsmall: 0xF7EE,
+ Icyrillic: 0x0406,
+ Idblgrave: 0x0208,
+ Idieresis: 0x00CF,
+ Idieresisacute: 0x1E2E,
+ Idieresiscyrillic: 0x04E4,
+ Idieresissmall: 0xF7EF,
+ Idot: 0x0130,
+ Idotaccent: 0x0130,
+ Idotbelow: 0x1ECA,
+ Iebrevecyrillic: 0x04D6,
+ Iecyrillic: 0x0415,
+ Ifraktur: 0x2111,
+ Igrave: 0x00CC,
+ Igravesmall: 0xF7EC,
+ Ihookabove: 0x1EC8,
+ Iicyrillic: 0x0418,
+ Iinvertedbreve: 0x020A,
+ Iishortcyrillic: 0x0419,
+ Imacron: 0x012A,
+ Imacroncyrillic: 0x04E2,
+ Imonospace: 0xFF29,
+ Iniarmenian: 0x053B,
+ Iocyrillic: 0x0401,
+ Iogonek: 0x012E,
+ Iota: 0x0399,
+ Iotaafrican: 0x0196,
+ Iotadieresis: 0x03AA,
+ Iotatonos: 0x038A,
+ Ismall: 0xF769,
+ Istroke: 0x0197,
+ Itilde: 0x0128,
+ Itildebelow: 0x1E2C,
+ Izhitsacyrillic: 0x0474,
+ Izhitsadblgravecyrillic: 0x0476,
+ J: 0x004A,
+ Jaarmenian: 0x0541,
+ Jcircle: 0x24BF,
+ Jcircumflex: 0x0134,
+ Jecyrillic: 0x0408,
+ Jheharmenian: 0x054B,
+ Jmonospace: 0xFF2A,
+ Jsmall: 0xF76A,
+ K: 0x004B,
+ KBsquare: 0x3385,
+ KKsquare: 0x33CD,
+ Kabashkircyrillic: 0x04A0,
+ Kacute: 0x1E30,
+ Kacyrillic: 0x041A,
+ Kadescendercyrillic: 0x049A,
+ Kahookcyrillic: 0x04C3,
+ Kappa: 0x039A,
+ Kastrokecyrillic: 0x049E,
+ Kaverticalstrokecyrillic: 0x049C,
+ Kcaron: 0x01E8,
+ Kcedilla: 0x0136,
+ Kcircle: 0x24C0,
+ Kcommaaccent: 0x0136,
+ Kdotbelow: 0x1E32,
+ Keharmenian: 0x0554,
+ Kenarmenian: 0x053F,
+ Khacyrillic: 0x0425,
+ Kheicoptic: 0x03E6,
+ Khook: 0x0198,
+ Kjecyrillic: 0x040C,
+ Klinebelow: 0x1E34,
+ Kmonospace: 0xFF2B,
+ Koppacyrillic: 0x0480,
+ Koppagreek: 0x03DE,
+ Ksicyrillic: 0x046E,
+ Ksmall: 0xF76B,
+ L: 0x004C,
+ LJ: 0x01C7,
+ LL: 0xF6BF,
+ Lacute: 0x0139,
+ Lambda: 0x039B,
+ Lcaron: 0x013D,
+ Lcedilla: 0x013B,
+ Lcircle: 0x24C1,
+ Lcircumflexbelow: 0x1E3C,
+ Lcommaaccent: 0x013B,
+ Ldot: 0x013F,
+ Ldotaccent: 0x013F,
+ Ldotbelow: 0x1E36,
+ Ldotbelowmacron: 0x1E38,
+ Liwnarmenian: 0x053C,
+ Lj: 0x01C8,
+ Ljecyrillic: 0x0409,
+ Llinebelow: 0x1E3A,
+ Lmonospace: 0xFF2C,
+ Lslash: 0x0141,
+ Lslashsmall: 0xF6F9,
+ Lsmall: 0xF76C,
+ M: 0x004D,
+ MBsquare: 0x3386,
+ Macron: 0xF6D0,
+ Macronsmall: 0xF7AF,
+ Macute: 0x1E3E,
+ Mcircle: 0x24C2,
+ Mdotaccent: 0x1E40,
+ Mdotbelow: 0x1E42,
+ Menarmenian: 0x0544,
+ Mmonospace: 0xFF2D,
+ Msmall: 0xF76D,
+ Mturned: 0x019C,
+ Mu: 0x039C,
+ N: 0x004E,
+ NJ: 0x01CA,
+ Nacute: 0x0143,
+ Ncaron: 0x0147,
+ Ncedilla: 0x0145,
+ Ncircle: 0x24C3,
+ Ncircumflexbelow: 0x1E4A,
+ Ncommaaccent: 0x0145,
+ Ndotaccent: 0x1E44,
+ Ndotbelow: 0x1E46,
+ Nhookleft: 0x019D,
+ Nineroman: 0x2168,
+ Nj: 0x01CB,
+ Njecyrillic: 0x040A,
+ Nlinebelow: 0x1E48,
+ Nmonospace: 0xFF2E,
+ Nowarmenian: 0x0546,
+ Nsmall: 0xF76E,
+ Ntilde: 0x00D1,
+ Ntildesmall: 0xF7F1,
+ Nu: 0x039D,
+ O: 0x004F,
+ OE: 0x0152,
+ OEsmall: 0xF6FA,
+ Oacute: 0x00D3,
+ Oacutesmall: 0xF7F3,
+ Obarredcyrillic: 0x04E8,
+ Obarreddieresiscyrillic: 0x04EA,
+ Obreve: 0x014E,
+ Ocaron: 0x01D1,
+ Ocenteredtilde: 0x019F,
+ Ocircle: 0x24C4,
+ Ocircumflex: 0x00D4,
+ Ocircumflexacute: 0x1ED0,
+ Ocircumflexdotbelow: 0x1ED8,
+ Ocircumflexgrave: 0x1ED2,
+ Ocircumflexhookabove: 0x1ED4,
+ Ocircumflexsmall: 0xF7F4,
+ Ocircumflextilde: 0x1ED6,
+ Ocyrillic: 0x041E,
+ Odblacute: 0x0150,
+ Odblgrave: 0x020C,
+ Odieresis: 0x00D6,
+ Odieresiscyrillic: 0x04E6,
+ Odieresissmall: 0xF7F6,
+ Odotbelow: 0x1ECC,
+ Ogoneksmall: 0xF6FB,
+ Ograve: 0x00D2,
+ Ogravesmall: 0xF7F2,
+ Oharmenian: 0x0555,
+ Ohm: 0x2126,
+ Ohookabove: 0x1ECE,
+ Ohorn: 0x01A0,
+ Ohornacute: 0x1EDA,
+ Ohorndotbelow: 0x1EE2,
+ Ohorngrave: 0x1EDC,
+ Ohornhookabove: 0x1EDE,
+ Ohorntilde: 0x1EE0,
+ Ohungarumlaut: 0x0150,
+ Oi: 0x01A2,
+ Oinvertedbreve: 0x020E,
+ Omacron: 0x014C,
+ Omacronacute: 0x1E52,
+ Omacrongrave: 0x1E50,
+ Omega: 0x2126,
+ Omegacyrillic: 0x0460,
+ Omegagreek: 0x03A9,
+ Omegaroundcyrillic: 0x047A,
+ Omegatitlocyrillic: 0x047C,
+ Omegatonos: 0x038F,
+ Omicron: 0x039F,
+ Omicrontonos: 0x038C,
+ Omonospace: 0xFF2F,
+ Oneroman: 0x2160,
+ Oogonek: 0x01EA,
+ Oogonekmacron: 0x01EC,
+ Oopen: 0x0186,
+ Oslash: 0x00D8,
+ Oslashacute: 0x01FE,
+ Oslashsmall: 0xF7F8,
+ Osmall: 0xF76F,
+ Ostrokeacute: 0x01FE,
+ Otcyrillic: 0x047E,
+ Otilde: 0x00D5,
+ Otildeacute: 0x1E4C,
+ Otildedieresis: 0x1E4E,
+ Otildesmall: 0xF7F5,
+ P: 0x0050,
+ Pacute: 0x1E54,
+ Pcircle: 0x24C5,
+ Pdotaccent: 0x1E56,
+ Pecyrillic: 0x041F,
+ Peharmenian: 0x054A,
+ Pemiddlehookcyrillic: 0x04A6,
+ Phi: 0x03A6,
+ Phook: 0x01A4,
+ Pi: 0x03A0,
+ Piwrarmenian: 0x0553,
+ Pmonospace: 0xFF30,
+ Psi: 0x03A8,
+ Psicyrillic: 0x0470,
+ Psmall: 0xF770,
+ Q: 0x0051,
+ Qcircle: 0x24C6,
+ Qmonospace: 0xFF31,
+ Qsmall: 0xF771,
+ R: 0x0052,
+ Raarmenian: 0x054C,
+ Racute: 0x0154,
+ Rcaron: 0x0158,
+ Rcedilla: 0x0156,
+ Rcircle: 0x24C7,
+ Rcommaaccent: 0x0156,
+ Rdblgrave: 0x0210,
+ Rdotaccent: 0x1E58,
+ Rdotbelow: 0x1E5A,
+ Rdotbelowmacron: 0x1E5C,
+ Reharmenian: 0x0550,
+ Rfraktur: 0x211C,
+ Rho: 0x03A1,
+ Ringsmall: 0xF6FC,
+ Rinvertedbreve: 0x0212,
+ Rlinebelow: 0x1E5E,
+ Rmonospace: 0xFF32,
+ Rsmall: 0xF772,
+ Rsmallinverted: 0x0281,
+ Rsmallinvertedsuperior: 0x02B6,
+ S: 0x0053,
+ SF010000: 0x250C,
+ SF020000: 0x2514,
+ SF030000: 0x2510,
+ SF040000: 0x2518,
+ SF050000: 0x253C,
+ SF060000: 0x252C,
+ SF070000: 0x2534,
+ SF080000: 0x251C,
+ SF090000: 0x2524,
+ SF100000: 0x2500,
+ SF110000: 0x2502,
+ SF190000: 0x2561,
+ SF200000: 0x2562,
+ SF210000: 0x2556,
+ SF220000: 0x2555,
+ SF230000: 0x2563,
+ SF240000: 0x2551,
+ SF250000: 0x2557,
+ SF260000: 0x255D,
+ SF270000: 0x255C,
+ SF280000: 0x255B,
+ SF360000: 0x255E,
+ SF370000: 0x255F,
+ SF380000: 0x255A,
+ SF390000: 0x2554,
+ SF400000: 0x2569,
+ SF410000: 0x2566,
+ SF420000: 0x2560,
+ SF430000: 0x2550,
+ SF440000: 0x256C,
+ SF450000: 0x2567,
+ SF460000: 0x2568,
+ SF470000: 0x2564,
+ SF480000: 0x2565,
+ SF490000: 0x2559,
+ SF500000: 0x2558,
+ SF510000: 0x2552,
+ SF520000: 0x2553,
+ SF530000: 0x256B,
+ SF540000: 0x256A,
+ Sacute: 0x015A,
+ Sacutedotaccent: 0x1E64,
+ Sampigreek: 0x03E0,
+ Scaron: 0x0160,
+ Scarondotaccent: 0x1E66,
+ Scaronsmall: 0xF6FD,
+ Scedilla: 0x015E,
+ Schwa: 0x018F,
+ Schwacyrillic: 0x04D8,
+ Schwadieresiscyrillic: 0x04DA,
+ Scircle: 0x24C8,
+ Scircumflex: 0x015C,
+ Scommaaccent: 0x0218,
+ Sdotaccent: 0x1E60,
+ Sdotbelow: 0x1E62,
+ Sdotbelowdotaccent: 0x1E68,
+ Seharmenian: 0x054D,
+ Sevenroman: 0x2166,
+ Shaarmenian: 0x0547,
+ Shacyrillic: 0x0428,
+ Shchacyrillic: 0x0429,
+ Sheicoptic: 0x03E2,
+ Shhacyrillic: 0x04BA,
+ Shimacoptic: 0x03EC,
+ Sigma: 0x03A3,
+ Sixroman: 0x2165,
+ Smonospace: 0xFF33,
+ Softsigncyrillic: 0x042C,
+ Ssmall: 0xF773,
+ Stigmagreek: 0x03DA,
+ T: 0x0054,
+ Tau: 0x03A4,
+ Tbar: 0x0166,
+ Tcaron: 0x0164,
+ Tcedilla: 0x0162,
+ Tcircle: 0x24C9,
+ Tcircumflexbelow: 0x1E70,
+ Tcommaaccent: 0x0162,
+ Tdotaccent: 0x1E6A,
+ Tdotbelow: 0x1E6C,
+ Tecyrillic: 0x0422,
+ Tedescendercyrillic: 0x04AC,
+ Tenroman: 0x2169,
+ Tetsecyrillic: 0x04B4,
+ Theta: 0x0398,
+ Thook: 0x01AC,
+ Thorn: 0x00DE,
+ Thornsmall: 0xF7FE,
+ Threeroman: 0x2162,
+ Tildesmall: 0xF6FE,
+ Tiwnarmenian: 0x054F,
+ Tlinebelow: 0x1E6E,
+ Tmonospace: 0xFF34,
+ Toarmenian: 0x0539,
+ Tonefive: 0x01BC,
+ Tonesix: 0x0184,
+ Tonetwo: 0x01A7,
+ Tretroflexhook: 0x01AE,
+ Tsecyrillic: 0x0426,
+ Tshecyrillic: 0x040B,
+ Tsmall: 0xF774,
+ Twelveroman: 0x216B,
+ Tworoman: 0x2161,
+ U: 0x0055,
+ Uacute: 0x00DA,
+ Uacutesmall: 0xF7FA,
+ Ubreve: 0x016C,
+ Ucaron: 0x01D3,
+ Ucircle: 0x24CA,
+ Ucircumflex: 0x00DB,
+ Ucircumflexbelow: 0x1E76,
+ Ucircumflexsmall: 0xF7FB,
+ Ucyrillic: 0x0423,
+ Udblacute: 0x0170,
+ Udblgrave: 0x0214,
+ Udieresis: 0x00DC,
+ Udieresisacute: 0x01D7,
+ Udieresisbelow: 0x1E72,
+ Udieresiscaron: 0x01D9,
+ Udieresiscyrillic: 0x04F0,
+ Udieresisgrave: 0x01DB,
+ Udieresismacron: 0x01D5,
+ Udieresissmall: 0xF7FC,
+ Udotbelow: 0x1EE4,
+ Ugrave: 0x00D9,
+ Ugravesmall: 0xF7F9,
+ Uhookabove: 0x1EE6,
+ Uhorn: 0x01AF,
+ Uhornacute: 0x1EE8,
+ Uhorndotbelow: 0x1EF0,
+ Uhorngrave: 0x1EEA,
+ Uhornhookabove: 0x1EEC,
+ Uhorntilde: 0x1EEE,
+ Uhungarumlaut: 0x0170,
+ Uhungarumlautcyrillic: 0x04F2,
+ Uinvertedbreve: 0x0216,
+ Ukcyrillic: 0x0478,
+ Umacron: 0x016A,
+ Umacroncyrillic: 0x04EE,
+ Umacrondieresis: 0x1E7A,
+ Umonospace: 0xFF35,
+ Uogonek: 0x0172,
+ Upsilon: 0x03A5,
+ Upsilon1: 0x03D2,
+ Upsilonacutehooksymbolgreek: 0x03D3,
+ Upsilonafrican: 0x01B1,
+ Upsilondieresis: 0x03AB,
+ Upsilondieresishooksymbolgreek: 0x03D4,
+ Upsilonhooksymbol: 0x03D2,
+ Upsilontonos: 0x038E,
+ Uring: 0x016E,
+ Ushortcyrillic: 0x040E,
+ Usmall: 0xF775,
+ Ustraightcyrillic: 0x04AE,
+ Ustraightstrokecyrillic: 0x04B0,
+ Utilde: 0x0168,
+ Utildeacute: 0x1E78,
+ Utildebelow: 0x1E74,
+ V: 0x0056,
+ Vcircle: 0x24CB,
+ Vdotbelow: 0x1E7E,
+ Vecyrillic: 0x0412,
+ Vewarmenian: 0x054E,
+ Vhook: 0x01B2,
+ Vmonospace: 0xFF36,
+ Voarmenian: 0x0548,
+ Vsmall: 0xF776,
+ Vtilde: 0x1E7C,
+ W: 0x0057,
+ Wacute: 0x1E82,
+ Wcircle: 0x24CC,
+ Wcircumflex: 0x0174,
+ Wdieresis: 0x1E84,
+ Wdotaccent: 0x1E86,
+ Wdotbelow: 0x1E88,
+ Wgrave: 0x1E80,
+ Wmonospace: 0xFF37,
+ Wsmall: 0xF777,
+ X: 0x0058,
+ Xcircle: 0x24CD,
+ Xdieresis: 0x1E8C,
+ Xdotaccent: 0x1E8A,
+ Xeharmenian: 0x053D,
+ Xi: 0x039E,
+ Xmonospace: 0xFF38,
+ Xsmall: 0xF778,
+ Y: 0x0059,
+ Yacute: 0x00DD,
+ Yacutesmall: 0xF7FD,
+ Yatcyrillic: 0x0462,
+ Ycircle: 0x24CE,
+ Ycircumflex: 0x0176,
+ Ydieresis: 0x0178,
+ Ydieresissmall: 0xF7FF,
+ Ydotaccent: 0x1E8E,
+ Ydotbelow: 0x1EF4,
+ Yericyrillic: 0x042B,
+ Yerudieresiscyrillic: 0x04F8,
+ Ygrave: 0x1EF2,
+ Yhook: 0x01B3,
+ Yhookabove: 0x1EF6,
+ Yiarmenian: 0x0545,
+ Yicyrillic: 0x0407,
+ Yiwnarmenian: 0x0552,
+ Ymonospace: 0xFF39,
+ Ysmall: 0xF779,
+ Ytilde: 0x1EF8,
+ Yusbigcyrillic: 0x046A,
+ Yusbigiotifiedcyrillic: 0x046C,
+ Yuslittlecyrillic: 0x0466,
+ Yuslittleiotifiedcyrillic: 0x0468,
+ Z: 0x005A,
+ Zaarmenian: 0x0536,
+ Zacute: 0x0179,
+ Zcaron: 0x017D,
+ Zcaronsmall: 0xF6FF,
+ Zcircle: 0x24CF,
+ Zcircumflex: 0x1E90,
+ Zdot: 0x017B,
+ Zdotaccent: 0x017B,
+ Zdotbelow: 0x1E92,
+ Zecyrillic: 0x0417,
+ Zedescendercyrillic: 0x0498,
+ Zedieresiscyrillic: 0x04DE,
+ Zeta: 0x0396,
+ Zhearmenian: 0x053A,
+ Zhebrevecyrillic: 0x04C1,
+ Zhecyrillic: 0x0416,
+ Zhedescendercyrillic: 0x0496,
+ Zhedieresiscyrillic: 0x04DC,
+ Zlinebelow: 0x1E94,
+ Zmonospace: 0xFF3A,
+ Zsmall: 0xF77A,
+ Zstroke: 0x01B5,
+ a: 0x0061,
+ aabengali: 0x0986,
+ aacute: 0x00E1,
+ aadeva: 0x0906,
+ aagujarati: 0x0A86,
+ aagurmukhi: 0x0A06,
+ aamatragurmukhi: 0x0A3E,
+ aarusquare: 0x3303,
+ aavowelsignbengali: 0x09BE,
+ aavowelsigndeva: 0x093E,
+ aavowelsigngujarati: 0x0ABE,
+ abbreviationmarkarmenian: 0x055F,
+ abbreviationsigndeva: 0x0970,
+ abengali: 0x0985,
+ abopomofo: 0x311A,
+ abreve: 0x0103,
+ abreveacute: 0x1EAF,
+ abrevecyrillic: 0x04D1,
+ abrevedotbelow: 0x1EB7,
+ abrevegrave: 0x1EB1,
+ abrevehookabove: 0x1EB3,
+ abrevetilde: 0x1EB5,
+ acaron: 0x01CE,
+ acircle: 0x24D0,
+ acircumflex: 0x00E2,
+ acircumflexacute: 0x1EA5,
+ acircumflexdotbelow: 0x1EAD,
+ acircumflexgrave: 0x1EA7,
+ acircumflexhookabove: 0x1EA9,
+ acircumflextilde: 0x1EAB,
+ acute: 0x00B4,
+ acutebelowcmb: 0x0317,
+ acutecmb: 0x0301,
+ acutecomb: 0x0301,
+ acutedeva: 0x0954,
+ acutelowmod: 0x02CF,
+ acutetonecmb: 0x0341,
+ acyrillic: 0x0430,
+ adblgrave: 0x0201,
+ addakgurmukhi: 0x0A71,
+ adeva: 0x0905,
+ adieresis: 0x00E4,
+ adieresiscyrillic: 0x04D3,
+ adieresismacron: 0x01DF,
+ adotbelow: 0x1EA1,
+ adotmacron: 0x01E1,
+ ae: 0x00E6,
+ aeacute: 0x01FD,
+ aekorean: 0x3150,
+ aemacron: 0x01E3,
+ afii00208: 0x2015,
+ afii08941: 0x20A4,
+ afii10017: 0x0410,
+ afii10018: 0x0411,
+ afii10019: 0x0412,
+ afii10020: 0x0413,
+ afii10021: 0x0414,
+ afii10022: 0x0415,
+ afii10023: 0x0401,
+ afii10024: 0x0416,
+ afii10025: 0x0417,
+ afii10026: 0x0418,
+ afii10027: 0x0419,
+ afii10028: 0x041A,
+ afii10029: 0x041B,
+ afii10030: 0x041C,
+ afii10031: 0x041D,
+ afii10032: 0x041E,
+ afii10033: 0x041F,
+ afii10034: 0x0420,
+ afii10035: 0x0421,
+ afii10036: 0x0422,
+ afii10037: 0x0423,
+ afii10038: 0x0424,
+ afii10039: 0x0425,
+ afii10040: 0x0426,
+ afii10041: 0x0427,
+ afii10042: 0x0428,
+ afii10043: 0x0429,
+ afii10044: 0x042A,
+ afii10045: 0x042B,
+ afii10046: 0x042C,
+ afii10047: 0x042D,
+ afii10048: 0x042E,
+ afii10049: 0x042F,
+ afii10050: 0x0490,
+ afii10051: 0x0402,
+ afii10052: 0x0403,
+ afii10053: 0x0404,
+ afii10054: 0x0405,
+ afii10055: 0x0406,
+ afii10056: 0x0407,
+ afii10057: 0x0408,
+ afii10058: 0x0409,
+ afii10059: 0x040A,
+ afii10060: 0x040B,
+ afii10061: 0x040C,
+ afii10062: 0x040E,
+ afii10063: 0xF6C4,
+ afii10064: 0xF6C5,
+ afii10065: 0x0430,
+ afii10066: 0x0431,
+ afii10067: 0x0432,
+ afii10068: 0x0433,
+ afii10069: 0x0434,
+ afii10070: 0x0435,
+ afii10071: 0x0451,
+ afii10072: 0x0436,
+ afii10073: 0x0437,
+ afii10074: 0x0438,
+ afii10075: 0x0439,
+ afii10076: 0x043A,
+ afii10077: 0x043B,
+ afii10078: 0x043C,
+ afii10079: 0x043D,
+ afii10080: 0x043E,
+ afii10081: 0x043F,
+ afii10082: 0x0440,
+ afii10083: 0x0441,
+ afii10084: 0x0442,
+ afii10085: 0x0443,
+ afii10086: 0x0444,
+ afii10087: 0x0445,
+ afii10088: 0x0446,
+ afii10089: 0x0447,
+ afii10090: 0x0448,
+ afii10091: 0x0449,
+ afii10092: 0x044A,
+ afii10093: 0x044B,
+ afii10094: 0x044C,
+ afii10095: 0x044D,
+ afii10096: 0x044E,
+ afii10097: 0x044F,
+ afii10098: 0x0491,
+ afii10099: 0x0452,
+ afii10100: 0x0453,
+ afii10101: 0x0454,
+ afii10102: 0x0455,
+ afii10103: 0x0456,
+ afii10104: 0x0457,
+ afii10105: 0x0458,
+ afii10106: 0x0459,
+ afii10107: 0x045A,
+ afii10108: 0x045B,
+ afii10109: 0x045C,
+ afii10110: 0x045E,
+ afii10145: 0x040F,
+ afii10146: 0x0462,
+ afii10147: 0x0472,
+ afii10148: 0x0474,
+ afii10192: 0xF6C6,
+ afii10193: 0x045F,
+ afii10194: 0x0463,
+ afii10195: 0x0473,
+ afii10196: 0x0475,
+ afii10831: 0xF6C7,
+ afii10832: 0xF6C8,
+ afii10846: 0x04D9,
+ afii299: 0x200E,
+ afii300: 0x200F,
+ afii301: 0x200D,
+ afii57381: 0x066A,
+ afii57388: 0x060C,
+ afii57392: 0x0660,
+ afii57393: 0x0661,
+ afii57394: 0x0662,
+ afii57395: 0x0663,
+ afii57396: 0x0664,
+ afii57397: 0x0665,
+ afii57398: 0x0666,
+ afii57399: 0x0667,
+ afii57400: 0x0668,
+ afii57401: 0x0669,
+ afii57403: 0x061B,
+ afii57407: 0x061F,
+ afii57409: 0x0621,
+ afii57410: 0x0622,
+ afii57411: 0x0623,
+ afii57412: 0x0624,
+ afii57413: 0x0625,
+ afii57414: 0x0626,
+ afii57415: 0x0627,
+ afii57416: 0x0628,
+ afii57417: 0x0629,
+ afii57418: 0x062A,
+ afii57419: 0x062B,
+ afii57420: 0x062C,
+ afii57421: 0x062D,
+ afii57422: 0x062E,
+ afii57423: 0x062F,
+ afii57424: 0x0630,
+ afii57425: 0x0631,
+ afii57426: 0x0632,
+ afii57427: 0x0633,
+ afii57428: 0x0634,
+ afii57429: 0x0635,
+ afii57430: 0x0636,
+ afii57431: 0x0637,
+ afii57432: 0x0638,
+ afii57433: 0x0639,
+ afii57434: 0x063A,
+ afii57440: 0x0640,
+ afii57441: 0x0641,
+ afii57442: 0x0642,
+ afii57443: 0x0643,
+ afii57444: 0x0644,
+ afii57445: 0x0645,
+ afii57446: 0x0646,
+ afii57448: 0x0648,
+ afii57449: 0x0649,
+ afii57450: 0x064A,
+ afii57451: 0x064B,
+ afii57452: 0x064C,
+ afii57453: 0x064D,
+ afii57454: 0x064E,
+ afii57455: 0x064F,
+ afii57456: 0x0650,
+ afii57457: 0x0651,
+ afii57458: 0x0652,
+ afii57470: 0x0647,
+ afii57505: 0x06A4,
+ afii57506: 0x067E,
+ afii57507: 0x0686,
+ afii57508: 0x0698,
+ afii57509: 0x06AF,
+ afii57511: 0x0679,
+ afii57512: 0x0688,
+ afii57513: 0x0691,
+ afii57514: 0x06BA,
+ afii57519: 0x06D2,
+ afii57534: 0x06D5,
+ afii57636: 0x20AA,
+ afii57645: 0x05BE,
+ afii57658: 0x05C3,
+ afii57664: 0x05D0,
+ afii57665: 0x05D1,
+ afii57666: 0x05D2,
+ afii57667: 0x05D3,
+ afii57668: 0x05D4,
+ afii57669: 0x05D5,
+ afii57670: 0x05D6,
+ afii57671: 0x05D7,
+ afii57672: 0x05D8,
+ afii57673: 0x05D9,
+ afii57674: 0x05DA,
+ afii57675: 0x05DB,
+ afii57676: 0x05DC,
+ afii57677: 0x05DD,
+ afii57678: 0x05DE,
+ afii57679: 0x05DF,
+ afii57680: 0x05E0,
+ afii57681: 0x05E1,
+ afii57682: 0x05E2,
+ afii57683: 0x05E3,
+ afii57684: 0x05E4,
+ afii57685: 0x05E5,
+ afii57686: 0x05E6,
+ afii57687: 0x05E7,
+ afii57688: 0x05E8,
+ afii57689: 0x05E9,
+ afii57690: 0x05EA,
+ afii57694: 0xFB2A,
+ afii57695: 0xFB2B,
+ afii57700: 0xFB4B,
+ afii57705: 0xFB1F,
+ afii57716: 0x05F0,
+ afii57717: 0x05F1,
+ afii57718: 0x05F2,
+ afii57723: 0xFB35,
+ afii57793: 0x05B4,
+ afii57794: 0x05B5,
+ afii57795: 0x05B6,
+ afii57796: 0x05BB,
+ afii57797: 0x05B8,
+ afii57798: 0x05B7,
+ afii57799: 0x05B0,
+ afii57800: 0x05B2,
+ afii57801: 0x05B1,
+ afii57802: 0x05B3,
+ afii57803: 0x05C2,
+ afii57804: 0x05C1,
+ afii57806: 0x05B9,
+ afii57807: 0x05BC,
+ afii57839: 0x05BD,
+ afii57841: 0x05BF,
+ afii57842: 0x05C0,
+ afii57929: 0x02BC,
+ afii61248: 0x2105,
+ afii61289: 0x2113,
+ afii61352: 0x2116,
+ afii61573: 0x202C,
+ afii61574: 0x202D,
+ afii61575: 0x202E,
+ afii61664: 0x200C,
+ afii63167: 0x066D,
+ afii64937: 0x02BD,
+ agrave: 0x00E0,
+ agujarati: 0x0A85,
+ agurmukhi: 0x0A05,
+ ahiragana: 0x3042,
+ ahookabove: 0x1EA3,
+ aibengali: 0x0990,
+ aibopomofo: 0x311E,
+ aideva: 0x0910,
+ aiecyrillic: 0x04D5,
+ aigujarati: 0x0A90,
+ aigurmukhi: 0x0A10,
+ aimatragurmukhi: 0x0A48,
+ ainarabic: 0x0639,
+ ainfinalarabic: 0xFECA,
+ aininitialarabic: 0xFECB,
+ ainmedialarabic: 0xFECC,
+ ainvertedbreve: 0x0203,
+ aivowelsignbengali: 0x09C8,
+ aivowelsigndeva: 0x0948,
+ aivowelsigngujarati: 0x0AC8,
+ akatakana: 0x30A2,
+ akatakanahalfwidth: 0xFF71,
+ akorean: 0x314F,
+ alef: 0x05D0,
+ alefarabic: 0x0627,
+ alefdageshhebrew: 0xFB30,
+ aleffinalarabic: 0xFE8E,
+ alefhamzaabovearabic: 0x0623,
+ alefhamzaabovefinalarabic: 0xFE84,
+ alefhamzabelowarabic: 0x0625,
+ alefhamzabelowfinalarabic: 0xFE88,
+ alefhebrew: 0x05D0,
+ aleflamedhebrew: 0xFB4F,
+ alefmaddaabovearabic: 0x0622,
+ alefmaddaabovefinalarabic: 0xFE82,
+ alefmaksuraarabic: 0x0649,
+ alefmaksurafinalarabic: 0xFEF0,
+ alefmaksurainitialarabic: 0xFEF3,
+ alefmaksuramedialarabic: 0xFEF4,
+ alefpatahhebrew: 0xFB2E,
+ alefqamatshebrew: 0xFB2F,
+ aleph: 0x2135,
+ allequal: 0x224C,
+ alpha: 0x03B1,
+ alphatonos: 0x03AC,
+ amacron: 0x0101,
+ amonospace: 0xFF41,
+ ampersand: 0x0026,
+ ampersandmonospace: 0xFF06,
+ ampersandsmall: 0xF726,
+ amsquare: 0x33C2,
+ anbopomofo: 0x3122,
+ angbopomofo: 0x3124,
+ angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
+ angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
+ angkhankhuthai: 0x0E5A,
+ angle: 0x2220,
+ anglebracketleft: 0x3008,
+ anglebracketleftvertical: 0xFE3F,
+ anglebracketright: 0x3009,
+ anglebracketrightvertical: 0xFE40,
+ angleleft: 0x2329,
+ angleright: 0x232A,
+ angstrom: 0x212B,
+ anoteleia: 0x0387,
+ anudattadeva: 0x0952,
+ anusvarabengali: 0x0982,
+ anusvaradeva: 0x0902,
+ anusvaragujarati: 0x0A82,
+ aogonek: 0x0105,
+ apaatosquare: 0x3300,
+ aparen: 0x249C,
+ apostrophearmenian: 0x055A,
+ apostrophemod: 0x02BC,
+ apple: 0xF8FF,
+ approaches: 0x2250,
+ approxequal: 0x2248,
+ approxequalorimage: 0x2252,
+ approximatelyequal: 0x2245,
+ araeaekorean: 0x318E,
+ araeakorean: 0x318D,
+ arc: 0x2312,
+ arighthalfring: 0x1E9A,
+ aring: 0x00E5,
+ aringacute: 0x01FB,
+ aringbelow: 0x1E01,
+ arrowboth: 0x2194,
+ arrowdashdown: 0x21E3,
+ arrowdashleft: 0x21E0,
+ arrowdashright: 0x21E2,
+ arrowdashup: 0x21E1,
+ arrowdblboth: 0x21D4,
+ arrowdbldown: 0x21D3,
+ arrowdblleft: 0x21D0,
+ arrowdblright: 0x21D2,
+ arrowdblup: 0x21D1,
+ arrowdown: 0x2193,
+ arrowdownleft: 0x2199,
+ arrowdownright: 0x2198,
+ arrowdownwhite: 0x21E9,
+ arrowheaddownmod: 0x02C5,
+ arrowheadleftmod: 0x02C2,
+ arrowheadrightmod: 0x02C3,
+ arrowheadupmod: 0x02C4,
+ arrowhorizex: 0xF8E7,
+ arrowleft: 0x2190,
+ arrowleftdbl: 0x21D0,
+ arrowleftdblstroke: 0x21CD,
+ arrowleftoverright: 0x21C6,
+ arrowleftwhite: 0x21E6,
+ arrowright: 0x2192,
+ arrowrightdblstroke: 0x21CF,
+ arrowrightheavy: 0x279E,
+ arrowrightoverleft: 0x21C4,
+ arrowrightwhite: 0x21E8,
+ arrowtableft: 0x21E4,
+ arrowtabright: 0x21E5,
+ arrowup: 0x2191,
+ arrowupdn: 0x2195,
+ arrowupdnbse: 0x21A8,
+ arrowupdownbase: 0x21A8,
+ arrowupleft: 0x2196,
+ arrowupleftofdown: 0x21C5,
+ arrowupright: 0x2197,
+ arrowupwhite: 0x21E7,
+ arrowvertex: 0xF8E6,
+ asciicircum: 0x005E,
+ asciicircummonospace: 0xFF3E,
+ asciitilde: 0x007E,
+ asciitildemonospace: 0xFF5E,
+ ascript: 0x0251,
+ ascriptturned: 0x0252,
+ asmallhiragana: 0x3041,
+ asmallkatakana: 0x30A1,
+ asmallkatakanahalfwidth: 0xFF67,
+ asterisk: 0x002A,
+ asteriskaltonearabic: 0x066D,
+ asteriskarabic: 0x066D,
+ asteriskmath: 0x2217,
+ asteriskmonospace: 0xFF0A,
+ asterisksmall: 0xFE61,
+ asterism: 0x2042,
+ asuperior: 0xF6E9,
+ asymptoticallyequal: 0x2243,
+ at: 0x0040,
+ atilde: 0x00E3,
+ atmonospace: 0xFF20,
+ atsmall: 0xFE6B,
+ aturned: 0x0250,
+ aubengali: 0x0994,
+ aubopomofo: 0x3120,
+ audeva: 0x0914,
+ augujarati: 0x0A94,
+ augurmukhi: 0x0A14,
+ aulengthmarkbengali: 0x09D7,
+ aumatragurmukhi: 0x0A4C,
+ auvowelsignbengali: 0x09CC,
+ auvowelsigndeva: 0x094C,
+ auvowelsigngujarati: 0x0ACC,
+ avagrahadeva: 0x093D,
+ aybarmenian: 0x0561,
+ ayin: 0x05E2,
+ ayinaltonehebrew: 0xFB20,
+ ayinhebrew: 0x05E2,
+ b: 0x0062,
+ babengali: 0x09AC,
+ backslash: 0x005C,
+ backslashmonospace: 0xFF3C,
+ badeva: 0x092C,
+ bagujarati: 0x0AAC,
+ bagurmukhi: 0x0A2C,
+ bahiragana: 0x3070,
+ bahtthai: 0x0E3F,
+ bakatakana: 0x30D0,
+ bar: 0x007C,
+ barmonospace: 0xFF5C,
+ bbopomofo: 0x3105,
+ bcircle: 0x24D1,
+ bdotaccent: 0x1E03,
+ bdotbelow: 0x1E05,
+ beamedsixteenthnotes: 0x266C,
+ because: 0x2235,
+ becyrillic: 0x0431,
+ beharabic: 0x0628,
+ behfinalarabic: 0xFE90,
+ behinitialarabic: 0xFE91,
+ behiragana: 0x3079,
+ behmedialarabic: 0xFE92,
+ behmeeminitialarabic: 0xFC9F,
+ behmeemisolatedarabic: 0xFC08,
+ behnoonfinalarabic: 0xFC6D,
+ bekatakana: 0x30D9,
+ benarmenian: 0x0562,
+ bet: 0x05D1,
+ beta: 0x03B2,
+ betasymbolgreek: 0x03D0,
+ betdagesh: 0xFB31,
+ betdageshhebrew: 0xFB31,
+ bethebrew: 0x05D1,
+ betrafehebrew: 0xFB4C,
+ bhabengali: 0x09AD,
+ bhadeva: 0x092D,
+ bhagujarati: 0x0AAD,
+ bhagurmukhi: 0x0A2D,
+ bhook: 0x0253,
+ bihiragana: 0x3073,
+ bikatakana: 0x30D3,
+ bilabialclick: 0x0298,
+ bindigurmukhi: 0x0A02,
+ birusquare: 0x3331,
+ blackcircle: 0x25CF,
+ blackdiamond: 0x25C6,
+ blackdownpointingtriangle: 0x25BC,
+ blackleftpointingpointer: 0x25C4,
+ blackleftpointingtriangle: 0x25C0,
+ blacklenticularbracketleft: 0x3010,
+ blacklenticularbracketleftvertical: 0xFE3B,
+ blacklenticularbracketright: 0x3011,
+ blacklenticularbracketrightvertical: 0xFE3C,
+ blacklowerlefttriangle: 0x25E3,
+ blacklowerrighttriangle: 0x25E2,
+ blackrectangle: 0x25AC,
+ blackrightpointingpointer: 0x25BA,
+ blackrightpointingtriangle: 0x25B6,
+ blacksmallsquare: 0x25AA,
+ blacksmilingface: 0x263B,
+ blacksquare: 0x25A0,
+ blackstar: 0x2605,
+ blackupperlefttriangle: 0x25E4,
+ blackupperrighttriangle: 0x25E5,
+ blackuppointingsmalltriangle: 0x25B4,
+ blackuppointingtriangle: 0x25B2,
+ blank: 0x2423,
+ blinebelow: 0x1E07,
+ block: 0x2588,
+ bmonospace: 0xFF42,
+ bobaimaithai: 0x0E1A,
+ bohiragana: 0x307C,
+ bokatakana: 0x30DC,
+ bparen: 0x249D,
+ bqsquare: 0x33C3,
+ braceex: 0xF8F4,
+ braceleft: 0x007B,
+ braceleftbt: 0xF8F3,
+ braceleftmid: 0xF8F2,
+ braceleftmonospace: 0xFF5B,
+ braceleftsmall: 0xFE5B,
+ bracelefttp: 0xF8F1,
+ braceleftvertical: 0xFE37,
+ braceright: 0x007D,
+ bracerightbt: 0xF8FE,
+ bracerightmid: 0xF8FD,
+ bracerightmonospace: 0xFF5D,
+ bracerightsmall: 0xFE5C,
+ bracerighttp: 0xF8FC,
+ bracerightvertical: 0xFE38,
+ bracketleft: 0x005B,
+ bracketleftbt: 0xF8F0,
+ bracketleftex: 0xF8EF,
+ bracketleftmonospace: 0xFF3B,
+ bracketlefttp: 0xF8EE,
+ bracketright: 0x005D,
+ bracketrightbt: 0xF8FB,
+ bracketrightex: 0xF8FA,
+ bracketrightmonospace: 0xFF3D,
+ bracketrighttp: 0xF8F9,
+ breve: 0x02D8,
+ brevebelowcmb: 0x032E,
+ brevecmb: 0x0306,
+ breveinvertedbelowcmb: 0x032F,
+ breveinvertedcmb: 0x0311,
+ breveinverteddoublecmb: 0x0361,
+ bridgebelowcmb: 0x032A,
+ bridgeinvertedbelowcmb: 0x033A,
+ brokenbar: 0x00A6,
+ bstroke: 0x0180,
+ bsuperior: 0xF6EA,
+ btopbar: 0x0183,
+ buhiragana: 0x3076,
+ bukatakana: 0x30D6,
+ bullet: 0x2022,
+ bulletinverse: 0x25D8,
+ bulletoperator: 0x2219,
+ bullseye: 0x25CE,
+ c: 0x0063,
+ caarmenian: 0x056E,
+ cabengali: 0x099A,
+ cacute: 0x0107,
+ cadeva: 0x091A,
+ cagujarati: 0x0A9A,
+ cagurmukhi: 0x0A1A,
+ calsquare: 0x3388,
+ candrabindubengali: 0x0981,
+ candrabinducmb: 0x0310,
+ candrabindudeva: 0x0901,
+ candrabindugujarati: 0x0A81,
+ capslock: 0x21EA,
+ careof: 0x2105,
+ caron: 0x02C7,
+ caronbelowcmb: 0x032C,
+ caroncmb: 0x030C,
+ carriagereturn: 0x21B5,
+ cbopomofo: 0x3118,
+ ccaron: 0x010D,
+ ccedilla: 0x00E7,
+ ccedillaacute: 0x1E09,
+ ccircle: 0x24D2,
+ ccircumflex: 0x0109,
+ ccurl: 0x0255,
+ cdot: 0x010B,
+ cdotaccent: 0x010B,
+ cdsquare: 0x33C5,
+ cedilla: 0x00B8,
+ cedillacmb: 0x0327,
+ cent: 0x00A2,
+ centigrade: 0x2103,
+ centinferior: 0xF6DF,
+ centmonospace: 0xFFE0,
+ centoldstyle: 0xF7A2,
+ centsuperior: 0xF6E0,
+ chaarmenian: 0x0579,
+ chabengali: 0x099B,
+ chadeva: 0x091B,
+ chagujarati: 0x0A9B,
+ chagurmukhi: 0x0A1B,
+ chbopomofo: 0x3114,
+ cheabkhasiancyrillic: 0x04BD,
+ checkmark: 0x2713,
+ checyrillic: 0x0447,
+ chedescenderabkhasiancyrillic: 0x04BF,
+ chedescendercyrillic: 0x04B7,
+ chedieresiscyrillic: 0x04F5,
+ cheharmenian: 0x0573,
+ chekhakassiancyrillic: 0x04CC,
+ cheverticalstrokecyrillic: 0x04B9,
+ chi: 0x03C7,
+ chieuchacirclekorean: 0x3277,
+ chieuchaparenkorean: 0x3217,
+ chieuchcirclekorean: 0x3269,
+ chieuchkorean: 0x314A,
+ chieuchparenkorean: 0x3209,
+ chochangthai: 0x0E0A,
+ chochanthai: 0x0E08,
+ chochingthai: 0x0E09,
+ chochoethai: 0x0E0C,
+ chook: 0x0188,
+ cieucacirclekorean: 0x3276,
+ cieucaparenkorean: 0x3216,
+ cieuccirclekorean: 0x3268,
+ cieuckorean: 0x3148,
+ cieucparenkorean: 0x3208,
+ cieucuparenkorean: 0x321C,
+ circle: 0x25CB,
+ circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
+ circlemultiply: 0x2297,
+ circleot: 0x2299,
+ circleplus: 0x2295,
+ circlepostalmark: 0x3036,
+ circlewithlefthalfblack: 0x25D0,
+ circlewithrighthalfblack: 0x25D1,
+ circumflex: 0x02C6,
+ circumflexbelowcmb: 0x032D,
+ circumflexcmb: 0x0302,
+ clear: 0x2327,
+ clickalveolar: 0x01C2,
+ clickdental: 0x01C0,
+ clicklateral: 0x01C1,
+ clickretroflex: 0x01C3,
+ club: 0x2663,
+ clubsuitblack: 0x2663,
+ clubsuitwhite: 0x2667,
+ cmcubedsquare: 0x33A4,
+ cmonospace: 0xFF43,
+ cmsquaredsquare: 0x33A0,
+ coarmenian: 0x0581,
+ colon: 0x003A,
+ colonmonetary: 0x20A1,
+ colonmonospace: 0xFF1A,
+ colonsign: 0x20A1,
+ colonsmall: 0xFE55,
+ colontriangularhalfmod: 0x02D1,
+ colontriangularmod: 0x02D0,
+ comma: 0x002C,
+ commaabovecmb: 0x0313,
+ commaaboverightcmb: 0x0315,
+ commaaccent: 0xF6C3,
+ commaarabic: 0x060C,
+ commaarmenian: 0x055D,
+ commainferior: 0xF6E1,
+ commamonospace: 0xFF0C,
+ commareversedabovecmb: 0x0314,
+ commareversedmod: 0x02BD,
+ commasmall: 0xFE50,
+ commasuperior: 0xF6E2,
+ commaturnedabovecmb: 0x0312,
+ commaturnedmod: 0x02BB,
+ compass: 0x263C,
+ congruent: 0x2245,
+ contourintegral: 0x222E,
+ control: 0x2303,
+ controlACK: 0x0006,
+ controlBEL: 0x0007,
+ controlBS: 0x0008,
+ controlCAN: 0x0018,
+ controlCR: 0x000D,
+ controlDC1: 0x0011,
+ controlDC2: 0x0012,
+ controlDC3: 0x0013,
+ controlDC4: 0x0014,
+ controlDEL: 0x007F,
+ controlDLE: 0x0010,
+ controlEM: 0x0019,
+ controlENQ: 0x0005,
+ controlEOT: 0x0004,
+ controlESC: 0x001B,
+ controlETB: 0x0017,
+ controlETX: 0x0003,
+ controlFF: 0x000C,
+ controlFS: 0x001C,
+ controlGS: 0x001D,
+ controlHT: 0x0009,
+ controlLF: 0x000A,
+ controlNAK: 0x0015,
+ controlRS: 0x001E,
+ controlSI: 0x000F,
+ controlSO: 0x000E,
+ controlSOT: 0x0002,
+ controlSTX: 0x0001,
+ controlSUB: 0x001A,
+ controlSYN: 0x0016,
+ controlUS: 0x001F,
+ controlVT: 0x000B,
+ copyright: 0x00A9,
+ copyrightsans: 0xF8E9,
+ copyrightserif: 0xF6D9,
+ cornerbracketleft: 0x300C,
+ cornerbracketlefthalfwidth: 0xFF62,
+ cornerbracketleftvertical: 0xFE41,
+ cornerbracketright: 0x300D,
+ cornerbracketrighthalfwidth: 0xFF63,
+ cornerbracketrightvertical: 0xFE42,
+ corporationsquare: 0x337F,
+ cosquare: 0x33C7,
+ coverkgsquare: 0x33C6,
+ cparen: 0x249E,
+ cruzeiro: 0x20A2,
+ cstretched: 0x0297,
+ curlyand: 0x22CF,
+ curlyor: 0x22CE,
+ currency: 0x00A4,
+ cyrBreve: 0xF6D1,
+ cyrFlex: 0xF6D2,
+ cyrbreve: 0xF6D4,
+ cyrflex: 0xF6D5,
+ d: 0x0064,
+ daarmenian: 0x0564,
+ dabengali: 0x09A6,
+ dadarabic: 0x0636,
+ dadeva: 0x0926,
+ dadfinalarabic: 0xFEBE,
+ dadinitialarabic: 0xFEBF,
+ dadmedialarabic: 0xFEC0,
+ dagesh: 0x05BC,
+ dageshhebrew: 0x05BC,
+ dagger: 0x2020,
+ daggerdbl: 0x2021,
+ dagujarati: 0x0AA6,
+ dagurmukhi: 0x0A26,
+ dahiragana: 0x3060,
+ dakatakana: 0x30C0,
+ dalarabic: 0x062F,
+ dalet: 0x05D3,
+ daletdagesh: 0xFB33,
+ daletdageshhebrew: 0xFB33,
+ dalethatafpatah: 0x05D305B2,
+ dalethatafpatahhebrew: 0x05D305B2,
+ dalethatafsegol: 0x05D305B1,
+ dalethatafsegolhebrew: 0x05D305B1,
+ dalethebrew: 0x05D3,
+ dalethiriq: 0x05D305B4,
+ dalethiriqhebrew: 0x05D305B4,
+ daletholam: 0x05D305B9,
+ daletholamhebrew: 0x05D305B9,
+ daletpatah: 0x05D305B7,
+ daletpatahhebrew: 0x05D305B7,
+ daletqamats: 0x05D305B8,
+ daletqamatshebrew: 0x05D305B8,
+ daletqubuts: 0x05D305BB,
+ daletqubutshebrew: 0x05D305BB,
+ daletsegol: 0x05D305B6,
+ daletsegolhebrew: 0x05D305B6,
+ daletsheva: 0x05D305B0,
+ daletshevahebrew: 0x05D305B0,
+ dalettsere: 0x05D305B5,
+ dalettserehebrew: 0x05D305B5,
+ dalfinalarabic: 0xFEAA,
+ dammaarabic: 0x064F,
+ dammalowarabic: 0x064F,
+ dammatanaltonearabic: 0x064C,
+ dammatanarabic: 0x064C,
+ danda: 0x0964,
+ dargahebrew: 0x05A7,
+ dargalefthebrew: 0x05A7,
+ dasiapneumatacyrilliccmb: 0x0485,
+ dblGrave: 0xF6D3,
+ dblanglebracketleft: 0x300A,
+ dblanglebracketleftvertical: 0xFE3D,
+ dblanglebracketright: 0x300B,
+ dblanglebracketrightvertical: 0xFE3E,
+ dblarchinvertedbelowcmb: 0x032B,
+ dblarrowleft: 0x21D4,
+ dblarrowright: 0x21D2,
+ dbldanda: 0x0965,
+ dblgrave: 0xF6D6,
+ dblgravecmb: 0x030F,
+ dblintegral: 0x222C,
+ dbllowline: 0x2017,
+ dbllowlinecmb: 0x0333,
+ dbloverlinecmb: 0x033F,
+ dblprimemod: 0x02BA,
+ dblverticalbar: 0x2016,
+ dblverticallineabovecmb: 0x030E,
+ dbopomofo: 0x3109,
+ dbsquare: 0x33C8,
+ dcaron: 0x010F,
+ dcedilla: 0x1E11,
+ dcircle: 0x24D3,
+ dcircumflexbelow: 0x1E13,
+ dcroat: 0x0111,
+ ddabengali: 0x09A1,
+ ddadeva: 0x0921,
+ ddagujarati: 0x0AA1,
+ ddagurmukhi: 0x0A21,
+ ddalarabic: 0x0688,
+ ddalfinalarabic: 0xFB89,
+ dddhadeva: 0x095C,
+ ddhabengali: 0x09A2,
+ ddhadeva: 0x0922,
+ ddhagujarati: 0x0AA2,
+ ddhagurmukhi: 0x0A22,
+ ddotaccent: 0x1E0B,
+ ddotbelow: 0x1E0D,
+ decimalseparatorarabic: 0x066B,
+ decimalseparatorpersian: 0x066B,
+ decyrillic: 0x0434,
+ degree: 0x00B0,
+ dehihebrew: 0x05AD,
+ dehiragana: 0x3067,
+ deicoptic: 0x03EF,
+ dekatakana: 0x30C7,
+ deleteleft: 0x232B,
+ deleteright: 0x2326,
+ delta: 0x03B4,
+ deltaturned: 0x018D,
+ denominatorminusonenumeratorbengali: 0x09F8,
+ dezh: 0x02A4,
+ dhabengali: 0x09A7,
+ dhadeva: 0x0927,
+ dhagujarati: 0x0AA7,
+ dhagurmukhi: 0x0A27,
+ dhook: 0x0257,
+ dialytikatonos: 0x0385,
+ dialytikatonoscmb: 0x0344,
+ diamond: 0x2666,
+ diamondsuitwhite: 0x2662,
+ dieresis: 0x00A8,
+ dieresisacute: 0xF6D7,
+ dieresisbelowcmb: 0x0324,
+ dieresiscmb: 0x0308,
+ dieresisgrave: 0xF6D8,
+ dieresistonos: 0x0385,
+ dihiragana: 0x3062,
+ dikatakana: 0x30C2,
+ dittomark: 0x3003,
+ divide: 0x00F7,
+ divides: 0x2223,
+ divisionslash: 0x2215,
+ djecyrillic: 0x0452,
+ dkshade: 0x2593,
+ dlinebelow: 0x1E0F,
+ dlsquare: 0x3397,
+ dmacron: 0x0111,
+ dmonospace: 0xFF44,
+ dnblock: 0x2584,
+ dochadathai: 0x0E0E,
+ dodekthai: 0x0E14,
+ dohiragana: 0x3069,
+ dokatakana: 0x30C9,
+ dollar: 0x0024,
+ dollarinferior: 0xF6E3,
+ dollarmonospace: 0xFF04,
+ dollaroldstyle: 0xF724,
+ dollarsmall: 0xFE69,
+ dollarsuperior: 0xF6E4,
+ dong: 0x20AB,
+ dorusquare: 0x3326,
+ dotaccent: 0x02D9,
+ dotaccentcmb: 0x0307,
+ dotbelowcmb: 0x0323,
+ dotbelowcomb: 0x0323,
+ dotkatakana: 0x30FB,
+ dotlessi: 0x0131,
+ dotlessj: 0xF6BE,
+ dotlessjstrokehook: 0x0284,
+ dotmath: 0x22C5,
+ dottedcircle: 0x25CC,
+ doubleyodpatah: 0xFB1F,
+ doubleyodpatahhebrew: 0xFB1F,
+ downtackbelowcmb: 0x031E,
+ downtackmod: 0x02D5,
+ dparen: 0x249F,
+ dsuperior: 0xF6EB,
+ dtail: 0x0256,
+ dtopbar: 0x018C,
+ duhiragana: 0x3065,
+ dukatakana: 0x30C5,
+ dz: 0x01F3,
+ dzaltone: 0x02A3,
+ dzcaron: 0x01C6,
+ dzcurl: 0x02A5,
+ dzeabkhasiancyrillic: 0x04E1,
+ dzecyrillic: 0x0455,
+ dzhecyrillic: 0x045F,
+ e: 0x0065,
+ eacute: 0x00E9,
+ earth: 0x2641,
+ ebengali: 0x098F,
+ ebopomofo: 0x311C,
+ ebreve: 0x0115,
+ ecandradeva: 0x090D,
+ ecandragujarati: 0x0A8D,
+ ecandravowelsigndeva: 0x0945,
+ ecandravowelsigngujarati: 0x0AC5,
+ ecaron: 0x011B,
+ ecedillabreve: 0x1E1D,
+ echarmenian: 0x0565,
+ echyiwnarmenian: 0x0587,
+ ecircle: 0x24D4,
+ ecircumflex: 0x00EA,
+ ecircumflexacute: 0x1EBF,
+ ecircumflexbelow: 0x1E19,
+ ecircumflexdotbelow: 0x1EC7,
+ ecircumflexgrave: 0x1EC1,
+ ecircumflexhookabove: 0x1EC3,
+ ecircumflextilde: 0x1EC5,
+ ecyrillic: 0x0454,
+ edblgrave: 0x0205,
+ edeva: 0x090F,
+ edieresis: 0x00EB,
+ edot: 0x0117,
+ edotaccent: 0x0117,
+ edotbelow: 0x1EB9,
+ eegurmukhi: 0x0A0F,
+ eematragurmukhi: 0x0A47,
+ efcyrillic: 0x0444,
+ egrave: 0x00E8,
+ egujarati: 0x0A8F,
+ eharmenian: 0x0567,
+ ehbopomofo: 0x311D,
+ ehiragana: 0x3048,
+ ehookabove: 0x1EBB,
+ eibopomofo: 0x311F,
+ eight: 0x0038,
+ eightarabic: 0x0668,
+ eightbengali: 0x09EE,
+ eightcircle: 0x2467,
+ eightcircleinversesansserif: 0x2791,
+ eightdeva: 0x096E,
+ eighteencircle: 0x2471,
+ eighteenparen: 0x2485,
+ eighteenperiod: 0x2499,
+ eightgujarati: 0x0AEE,
+ eightgurmukhi: 0x0A6E,
+ eighthackarabic: 0x0668,
+ eighthangzhou: 0x3028,
+ eighthnotebeamed: 0x266B,
+ eightideographicparen: 0x3227,
+ eightinferior: 0x2088,
+ eightmonospace: 0xFF18,
+ eightoldstyle: 0xF738,
+ eightparen: 0x247B,
+ eightperiod: 0x248F,
+ eightpersian: 0x06F8,
+ eightroman: 0x2177,
+ eightsuperior: 0x2078,
+ eightthai: 0x0E58,
+ einvertedbreve: 0x0207,
+ eiotifiedcyrillic: 0x0465,
+ ekatakana: 0x30A8,
+ ekatakanahalfwidth: 0xFF74,
+ ekonkargurmukhi: 0x0A74,
+ ekorean: 0x3154,
+ elcyrillic: 0x043B,
+ element: 0x2208,
+ elevencircle: 0x246A,
+ elevenparen: 0x247E,
+ elevenperiod: 0x2492,
+ elevenroman: 0x217A,
+ ellipsis: 0x2026,
+ ellipsisvertical: 0x22EE,
+ emacron: 0x0113,
+ emacronacute: 0x1E17,
+ emacrongrave: 0x1E15,
+ emcyrillic: 0x043C,
+ emdash: 0x2014,
+ emdashvertical: 0xFE31,
+ emonospace: 0xFF45,
+ emphasismarkarmenian: 0x055B,
+ emptyset: 0x2205,
+ enbopomofo: 0x3123,
+ encyrillic: 0x043D,
+ endash: 0x2013,
+ endashvertical: 0xFE32,
+ endescendercyrillic: 0x04A3,
+ eng: 0x014B,
+ engbopomofo: 0x3125,
+ enghecyrillic: 0x04A5,
+ enhookcyrillic: 0x04C8,
+ enspace: 0x2002,
+ eogonek: 0x0119,
+ eokorean: 0x3153,
+ eopen: 0x025B,
+ eopenclosed: 0x029A,
+ eopenreversed: 0x025C,
+ eopenreversedclosed: 0x025E,
+ eopenreversedhook: 0x025D,
+ eparen: 0x24A0,
+ epsilon: 0x03B5,
+ epsilontonos: 0x03AD,
+ equal: 0x003D,
+ equalmonospace: 0xFF1D,
+ equalsmall: 0xFE66,
+ equalsuperior: 0x207C,
+ equivalence: 0x2261,
+ erbopomofo: 0x3126,
+ ercyrillic: 0x0440,
+ ereversed: 0x0258,
+ ereversedcyrillic: 0x044D,
+ escyrillic: 0x0441,
+ esdescendercyrillic: 0x04AB,
+ esh: 0x0283,
+ eshcurl: 0x0286,
+ eshortdeva: 0x090E,
+ eshortvowelsigndeva: 0x0946,
+ eshreversedloop: 0x01AA,
+ eshsquatreversed: 0x0285,
+ esmallhiragana: 0x3047,
+ esmallkatakana: 0x30A7,
+ esmallkatakanahalfwidth: 0xFF6A,
+ estimated: 0x212E,
+ esuperior: 0xF6EC,
+ eta: 0x03B7,
+ etarmenian: 0x0568,
+ etatonos: 0x03AE,
+ eth: 0x00F0,
+ etilde: 0x1EBD,
+ etildebelow: 0x1E1B,
+ etnahtafoukhhebrew: 0x0591,
+ etnahtafoukhlefthebrew: 0x0591,
+ etnahtahebrew: 0x0591,
+ etnahtalefthebrew: 0x0591,
+ eturned: 0x01DD,
+ eukorean: 0x3161,
+ euro: 0x20AC,
+ evowelsignbengali: 0x09C7,
+ evowelsigndeva: 0x0947,
+ evowelsigngujarati: 0x0AC7,
+ exclam: 0x0021,
+ exclamarmenian: 0x055C,
+ exclamdbl: 0x203C,
+ exclamdown: 0x00A1,
+ exclamdownsmall: 0xF7A1,
+ exclammonospace: 0xFF01,
+ exclamsmall: 0xF721,
+ existential: 0x2203,
+ ezh: 0x0292,
+ ezhcaron: 0x01EF,
+ ezhcurl: 0x0293,
+ ezhreversed: 0x01B9,
+ ezhtail: 0x01BA,
+ f: 0x0066,
+ fadeva: 0x095E,
+ fagurmukhi: 0x0A5E,
+ fahrenheit: 0x2109,
+ fathaarabic: 0x064E,
+ fathalowarabic: 0x064E,
+ fathatanarabic: 0x064B,
+ fbopomofo: 0x3108,
+ fcircle: 0x24D5,
+ fdotaccent: 0x1E1F,
+ feharabic: 0x0641,
+ feharmenian: 0x0586,
+ fehfinalarabic: 0xFED2,
+ fehinitialarabic: 0xFED3,
+ fehmedialarabic: 0xFED4,
+ feicoptic: 0x03E5,
+ female: 0x2640,
+ ff: 0xFB00,
+ ffi: 0xFB03,
+ ffl: 0xFB04,
+ fi: 0xFB01,
+ fifteencircle: 0x246E,
+ fifteenparen: 0x2482,
+ fifteenperiod: 0x2496,
+ figuredash: 0x2012,
+ filledbox: 0x25A0,
+ filledrect: 0x25AC,
+ finalkaf: 0x05DA,
+ finalkafdagesh: 0xFB3A,
+ finalkafdageshhebrew: 0xFB3A,
+ finalkafhebrew: 0x05DA,
+ finalkafqamats: 0x05DA05B8,
+ finalkafqamatshebrew: 0x05DA05B8,
+ finalkafsheva: 0x05DA05B0,
+ finalkafshevahebrew: 0x05DA05B0,
+ finalmem: 0x05DD,
+ finalmemhebrew: 0x05DD,
+ finalnun: 0x05DF,
+ finalnunhebrew: 0x05DF,
+ finalpe: 0x05E3,
+ finalpehebrew: 0x05E3,
+ finaltsadi: 0x05E5,
+ finaltsadihebrew: 0x05E5,
+ firsttonechinese: 0x02C9,
+ fisheye: 0x25C9,
+ fitacyrillic: 0x0473,
+ five: 0x0035,
+ fivearabic: 0x0665,
+ fivebengali: 0x09EB,
+ fivecircle: 0x2464,
+ fivecircleinversesansserif: 0x278E,
+ fivedeva: 0x096B,
+ fiveeighths: 0x215D,
+ fivegujarati: 0x0AEB,
+ fivegurmukhi: 0x0A6B,
+ fivehackarabic: 0x0665,
+ fivehangzhou: 0x3025,
+ fiveideographicparen: 0x3224,
+ fiveinferior: 0x2085,
+ fivemonospace: 0xFF15,
+ fiveoldstyle: 0xF735,
+ fiveparen: 0x2478,
+ fiveperiod: 0x248C,
+ fivepersian: 0x06F5,
+ fiveroman: 0x2174,
+ fivesuperior: 0x2075,
+ fivethai: 0x0E55,
+ fl: 0xFB02,
+ florin: 0x0192,
+ fmonospace: 0xFF46,
+ fmsquare: 0x3399,
+ fofanthai: 0x0E1F,
+ fofathai: 0x0E1D,
+ fongmanthai: 0x0E4F,
+ forall: 0x2200,
+ four: 0x0034,
+ fourarabic: 0x0664,
+ fourbengali: 0x09EA,
+ fourcircle: 0x2463,
+ fourcircleinversesansserif: 0x278D,
+ fourdeva: 0x096A,
+ fourgujarati: 0x0AEA,
+ fourgurmukhi: 0x0A6A,
+ fourhackarabic: 0x0664,
+ fourhangzhou: 0x3024,
+ fourideographicparen: 0x3223,
+ fourinferior: 0x2084,
+ fourmonospace: 0xFF14,
+ fournumeratorbengali: 0x09F7,
+ fouroldstyle: 0xF734,
+ fourparen: 0x2477,
+ fourperiod: 0x248B,
+ fourpersian: 0x06F4,
+ fourroman: 0x2173,
+ foursuperior: 0x2074,
+ fourteencircle: 0x246D,
+ fourteenparen: 0x2481,
+ fourteenperiod: 0x2495,
+ fourthai: 0x0E54,
+ fourthtonechinese: 0x02CB,
+ fparen: 0x24A1,
+ fraction: 0x2044,
+ franc: 0x20A3,
+ g: 0x0067,
+ gabengali: 0x0997,
+ gacute: 0x01F5,
+ gadeva: 0x0917,
+ gafarabic: 0x06AF,
+ gaffinalarabic: 0xFB93,
+ gafinitialarabic: 0xFB94,
+ gafmedialarabic: 0xFB95,
+ gagujarati: 0x0A97,
+ gagurmukhi: 0x0A17,
+ gahiragana: 0x304C,
+ gakatakana: 0x30AC,
+ gamma: 0x03B3,
+ gammalatinsmall: 0x0263,
+ gammasuperior: 0x02E0,
+ gangiacoptic: 0x03EB,
+ gbopomofo: 0x310D,
+ gbreve: 0x011F,
+ gcaron: 0x01E7,
+ gcedilla: 0x0123,
+ gcircle: 0x24D6,
+ gcircumflex: 0x011D,
+ gcommaaccent: 0x0123,
+ gdot: 0x0121,
+ gdotaccent: 0x0121,
+ gecyrillic: 0x0433,
+ gehiragana: 0x3052,
+ gekatakana: 0x30B2,
+ geometricallyequal: 0x2251,
+ gereshaccenthebrew: 0x059C,
+ gereshhebrew: 0x05F3,
+ gereshmuqdamhebrew: 0x059D,
+ germandbls: 0x00DF,
+ gershayimaccenthebrew: 0x059E,
+ gershayimhebrew: 0x05F4,
+ getamark: 0x3013,
+ ghabengali: 0x0998,
+ ghadarmenian: 0x0572,
+ ghadeva: 0x0918,
+ ghagujarati: 0x0A98,
+ ghagurmukhi: 0x0A18,
+ ghainarabic: 0x063A,
+ ghainfinalarabic: 0xFECE,
+ ghaininitialarabic: 0xFECF,
+ ghainmedialarabic: 0xFED0,
+ ghemiddlehookcyrillic: 0x0495,
+ ghestrokecyrillic: 0x0493,
+ gheupturncyrillic: 0x0491,
+ ghhadeva: 0x095A,
+ ghhagurmukhi: 0x0A5A,
+ ghook: 0x0260,
+ ghzsquare: 0x3393,
+ gihiragana: 0x304E,
+ gikatakana: 0x30AE,
+ gimarmenian: 0x0563,
+ gimel: 0x05D2,
+ gimeldagesh: 0xFB32,
+ gimeldageshhebrew: 0xFB32,
+ gimelhebrew: 0x05D2,
+ gjecyrillic: 0x0453,
+ glottalinvertedstroke: 0x01BE,
+ glottalstop: 0x0294,
+ glottalstopinverted: 0x0296,
+ glottalstopmod: 0x02C0,
+ glottalstopreversed: 0x0295,
+ glottalstopreversedmod: 0x02C1,
+ glottalstopreversedsuperior: 0x02E4,
+ glottalstopstroke: 0x02A1,
+ glottalstopstrokereversed: 0x02A2,
+ gmacron: 0x1E21,
+ gmonospace: 0xFF47,
+ gohiragana: 0x3054,
+ gokatakana: 0x30B4,
+ gparen: 0x24A2,
+ gpasquare: 0x33AC,
+ gradient: 0x2207,
+ grave: 0x0060,
+ gravebelowcmb: 0x0316,
+ gravecmb: 0x0300,
+ gravecomb: 0x0300,
+ gravedeva: 0x0953,
+ gravelowmod: 0x02CE,
+ gravemonospace: 0xFF40,
+ gravetonecmb: 0x0340,
+ greater: 0x003E,
+ greaterequal: 0x2265,
+ greaterequalorless: 0x22DB,
+ greatermonospace: 0xFF1E,
+ greaterorequivalent: 0x2273,
+ greaterorless: 0x2277,
+ greateroverequal: 0x2267,
+ greatersmall: 0xFE65,
+ gscript: 0x0261,
+ gstroke: 0x01E5,
+ guhiragana: 0x3050,
+ guillemotleft: 0x00AB,
+ guillemotright: 0x00BB,
+ guilsinglleft: 0x2039,
+ guilsinglright: 0x203A,
+ gukatakana: 0x30B0,
+ guramusquare: 0x3318,
+ gysquare: 0x33C9,
+ h: 0x0068,
+ haabkhasiancyrillic: 0x04A9,
+ haaltonearabic: 0x06C1,
+ habengali: 0x09B9,
+ hadescendercyrillic: 0x04B3,
+ hadeva: 0x0939,
+ hagujarati: 0x0AB9,
+ hagurmukhi: 0x0A39,
+ haharabic: 0x062D,
+ hahfinalarabic: 0xFEA2,
+ hahinitialarabic: 0xFEA3,
+ hahiragana: 0x306F,
+ hahmedialarabic: 0xFEA4,
+ haitusquare: 0x332A,
+ hakatakana: 0x30CF,
+ hakatakanahalfwidth: 0xFF8A,
+ halantgurmukhi: 0x0A4D,
+ hamzaarabic: 0x0621,
+ hamzadammaarabic: 0x0621064F,
+ hamzadammatanarabic: 0x0621064C,
+ hamzafathaarabic: 0x0621064E,
+ hamzafathatanarabic: 0x0621064B,
+ hamzalowarabic: 0x0621,
+ hamzalowkasraarabic: 0x06210650,
+ hamzalowkasratanarabic: 0x0621064D,
+ hamzasukunarabic: 0x06210652,
+ hangulfiller: 0x3164,
+ hardsigncyrillic: 0x044A,
+ harpoonleftbarbup: 0x21BC,
+ harpoonrightbarbup: 0x21C0,
+ hasquare: 0x33CA,
+ hatafpatah: 0x05B2,
+ hatafpatah16: 0x05B2,
+ hatafpatah23: 0x05B2,
+ hatafpatah2f: 0x05B2,
+ hatafpatahhebrew: 0x05B2,
+ hatafpatahnarrowhebrew: 0x05B2,
+ hatafpatahquarterhebrew: 0x05B2,
+ hatafpatahwidehebrew: 0x05B2,
+ hatafqamats: 0x05B3,
+ hatafqamats1b: 0x05B3,
+ hatafqamats28: 0x05B3,
+ hatafqamats34: 0x05B3,
+ hatafqamatshebrew: 0x05B3,
+ hatafqamatsnarrowhebrew: 0x05B3,
+ hatafqamatsquarterhebrew: 0x05B3,
+ hatafqamatswidehebrew: 0x05B3,
+ hatafsegol: 0x05B1,
+ hatafsegol17: 0x05B1,
+ hatafsegol24: 0x05B1,
+ hatafsegol30: 0x05B1,
+ hatafsegolhebrew: 0x05B1,
+ hatafsegolnarrowhebrew: 0x05B1,
+ hatafsegolquarterhebrew: 0x05B1,
+ hatafsegolwidehebrew: 0x05B1,
+ hbar: 0x0127,
+ hbopomofo: 0x310F,
+ hbrevebelow: 0x1E2B,
+ hcedilla: 0x1E29,
+ hcircle: 0x24D7,
+ hcircumflex: 0x0125,
+ hdieresis: 0x1E27,
+ hdotaccent: 0x1E23,
+ hdotbelow: 0x1E25,
+ he: 0x05D4,
+ heart: 0x2665,
+ heartsuitblack: 0x2665,
+ heartsuitwhite: 0x2661,
+ hedagesh: 0xFB34,
+ hedageshhebrew: 0xFB34,
+ hehaltonearabic: 0x06C1,
+ heharabic: 0x0647,
+ hehebrew: 0x05D4,
+ hehfinalaltonearabic: 0xFBA7,
+ hehfinalalttwoarabic: 0xFEEA,
+ hehfinalarabic: 0xFEEA,
+ hehhamzaabovefinalarabic: 0xFBA5,
+ hehhamzaaboveisolatedarabic: 0xFBA4,
+ hehinitialaltonearabic: 0xFBA8,
+ hehinitialarabic: 0xFEEB,
+ hehiragana: 0x3078,
+ hehmedialaltonearabic: 0xFBA9,
+ hehmedialarabic: 0xFEEC,
+ heiseierasquare: 0x337B,
+ hekatakana: 0x30D8,
+ hekatakanahalfwidth: 0xFF8D,
+ hekutaarusquare: 0x3336,
+ henghook: 0x0267,
+ herutusquare: 0x3339,
+ het: 0x05D7,
+ hethebrew: 0x05D7,
+ hhook: 0x0266,
+ hhooksuperior: 0x02B1,
+ hieuhacirclekorean: 0x327B,
+ hieuhaparenkorean: 0x321B,
+ hieuhcirclekorean: 0x326D,
+ hieuhkorean: 0x314E,
+ hieuhparenkorean: 0x320D,
+ hihiragana: 0x3072,
+ hikatakana: 0x30D2,
+ hikatakanahalfwidth: 0xFF8B,
+ hiriq: 0x05B4,
+ hiriq14: 0x05B4,
+ hiriq21: 0x05B4,
+ hiriq2d: 0x05B4,
+ hiriqhebrew: 0x05B4,
+ hiriqnarrowhebrew: 0x05B4,
+ hiriqquarterhebrew: 0x05B4,
+ hiriqwidehebrew: 0x05B4,
+ hlinebelow: 0x1E96,
+ hmonospace: 0xFF48,
+ hoarmenian: 0x0570,
+ hohipthai: 0x0E2B,
+ hohiragana: 0x307B,
+ hokatakana: 0x30DB,
+ hokatakanahalfwidth: 0xFF8E,
+ holam: 0x05B9,
+ holam19: 0x05B9,
+ holam26: 0x05B9,
+ holam32: 0x05B9,
+ holamhebrew: 0x05B9,
+ holamnarrowhebrew: 0x05B9,
+ holamquarterhebrew: 0x05B9,
+ holamwidehebrew: 0x05B9,
+ honokhukthai: 0x0E2E,
+ hookabovecomb: 0x0309,
+ hookcmb: 0x0309,
+ hookpalatalizedbelowcmb: 0x0321,
+ hookretroflexbelowcmb: 0x0322,
+ hoonsquare: 0x3342,
+ horicoptic: 0x03E9,
+ horizontalbar: 0x2015,
+ horncmb: 0x031B,
+ hotsprings: 0x2668,
+ house: 0x2302,
+ hparen: 0x24A3,
+ hsuperior: 0x02B0,
+ hturned: 0x0265,
+ huhiragana: 0x3075,
+ huiitosquare: 0x3333,
+ hukatakana: 0x30D5,
+ hukatakanahalfwidth: 0xFF8C,
+ hungarumlaut: 0x02DD,
+ hungarumlautcmb: 0x030B,
+ hv: 0x0195,
+ hyphen: 0x002D,
+ hypheninferior: 0xF6E5,
+ hyphenmonospace: 0xFF0D,
+ hyphensmall: 0xFE63,
+ hyphensuperior: 0xF6E6,
+ hyphentwo: 0x2010,
+ i: 0x0069,
+ iacute: 0x00ED,
+ iacyrillic: 0x044F,
+ ibengali: 0x0987,
+ ibopomofo: 0x3127,
+ ibreve: 0x012D,
+ icaron: 0x01D0,
+ icircle: 0x24D8,
+ icircumflex: 0x00EE,
+ icyrillic: 0x0456,
+ idblgrave: 0x0209,
+ ideographearthcircle: 0x328F,
+ ideographfirecircle: 0x328B,
+ ideographicallianceparen: 0x323F,
+ ideographiccallparen: 0x323A,
+ ideographiccentrecircle: 0x32A5,
+ ideographicclose: 0x3006,
+ ideographiccomma: 0x3001,
+ ideographiccommaleft: 0xFF64,
+ ideographiccongratulationparen: 0x3237,
+ ideographiccorrectcircle: 0x32A3,
+ ideographicearthparen: 0x322F,
+ ideographicenterpriseparen: 0x323D,
+ ideographicexcellentcircle: 0x329D,
+ ideographicfestivalparen: 0x3240,
+ ideographicfinancialcircle: 0x3296,
+ ideographicfinancialparen: 0x3236,
+ ideographicfireparen: 0x322B,
+ ideographichaveparen: 0x3232,
+ ideographichighcircle: 0x32A4,
+ ideographiciterationmark: 0x3005,
+ ideographiclaborcircle: 0x3298,
+ ideographiclaborparen: 0x3238,
+ ideographicleftcircle: 0x32A7,
+ ideographiclowcircle: 0x32A6,
+ ideographicmedicinecircle: 0x32A9,
+ ideographicmetalparen: 0x322E,
+ ideographicmoonparen: 0x322A,
+ ideographicnameparen: 0x3234,
+ ideographicperiod: 0x3002,
+ ideographicprintcircle: 0x329E,
+ ideographicreachparen: 0x3243,
+ ideographicrepresentparen: 0x3239,
+ ideographicresourceparen: 0x323E,
+ ideographicrightcircle: 0x32A8,
+ ideographicsecretcircle: 0x3299,
+ ideographicselfparen: 0x3242,
+ ideographicsocietyparen: 0x3233,
+ ideographicspace: 0x3000,
+ ideographicspecialparen: 0x3235,
+ ideographicstockparen: 0x3231,
+ ideographicstudyparen: 0x323B,
+ ideographicsunparen: 0x3230,
+ ideographicsuperviseparen: 0x323C,
+ ideographicwaterparen: 0x322C,
+ ideographicwoodparen: 0x322D,
+ ideographiczero: 0x3007,
+ ideographmetalcircle: 0x328E,
+ ideographmooncircle: 0x328A,
+ ideographnamecircle: 0x3294,
+ ideographsuncircle: 0x3290,
+ ideographwatercircle: 0x328C,
+ ideographwoodcircle: 0x328D,
+ ideva: 0x0907,
+ idieresis: 0x00EF,
+ idieresisacute: 0x1E2F,
+ idieresiscyrillic: 0x04E5,
+ idotbelow: 0x1ECB,
+ iebrevecyrillic: 0x04D7,
+ iecyrillic: 0x0435,
+ ieungacirclekorean: 0x3275,
+ ieungaparenkorean: 0x3215,
+ ieungcirclekorean: 0x3267,
+ ieungkorean: 0x3147,
+ ieungparenkorean: 0x3207,
+ igrave: 0x00EC,
+ igujarati: 0x0A87,
+ igurmukhi: 0x0A07,
+ ihiragana: 0x3044,
+ ihookabove: 0x1EC9,
+ iibengali: 0x0988,
+ iicyrillic: 0x0438,
+ iideva: 0x0908,
+ iigujarati: 0x0A88,
+ iigurmukhi: 0x0A08,
+ iimatragurmukhi: 0x0A40,
+ iinvertedbreve: 0x020B,
+ iishortcyrillic: 0x0439,
+ iivowelsignbengali: 0x09C0,
+ iivowelsigndeva: 0x0940,
+ iivowelsigngujarati: 0x0AC0,
+ ij: 0x0133,
+ ikatakana: 0x30A4,
+ ikatakanahalfwidth: 0xFF72,
+ ikorean: 0x3163,
+ ilde: 0x02DC,
+ iluyhebrew: 0x05AC,
+ imacron: 0x012B,
+ imacroncyrillic: 0x04E3,
+ imageorapproximatelyequal: 0x2253,
+ imatragurmukhi: 0x0A3F,
+ imonospace: 0xFF49,
+ increment: 0x2206,
+ infinity: 0x221E,
+ iniarmenian: 0x056B,
+ integral: 0x222B,
+ integralbottom: 0x2321,
+ integralbt: 0x2321,
+ integralex: 0xF8F5,
+ integraltop: 0x2320,
+ integraltp: 0x2320,
+ intersection: 0x2229,
+ intisquare: 0x3305,
+ invbullet: 0x25D8,
+ invcircle: 0x25D9,
+ invsmileface: 0x263B,
+ iocyrillic: 0x0451,
+ iogonek: 0x012F,
+ iota: 0x03B9,
+ iotadieresis: 0x03CA,
+ iotadieresistonos: 0x0390,
+ iotalatin: 0x0269,
+ iotatonos: 0x03AF,
+ iparen: 0x24A4,
+ irigurmukhi: 0x0A72,
+ ismallhiragana: 0x3043,
+ ismallkatakana: 0x30A3,
+ ismallkatakanahalfwidth: 0xFF68,
+ issharbengali: 0x09FA,
+ istroke: 0x0268,
+ isuperior: 0xF6ED,
+ iterationhiragana: 0x309D,
+ iterationkatakana: 0x30FD,
+ itilde: 0x0129,
+ itildebelow: 0x1E2D,
+ iubopomofo: 0x3129,
+ iucyrillic: 0x044E,
+ ivowelsignbengali: 0x09BF,
+ ivowelsigndeva: 0x093F,
+ ivowelsigngujarati: 0x0ABF,
+ izhitsacyrillic: 0x0475,
+ izhitsadblgravecyrillic: 0x0477,
+ j: 0x006A,
+ jaarmenian: 0x0571,
+ jabengali: 0x099C,
+ jadeva: 0x091C,
+ jagujarati: 0x0A9C,
+ jagurmukhi: 0x0A1C,
+ jbopomofo: 0x3110,
+ jcaron: 0x01F0,
+ jcircle: 0x24D9,
+ jcircumflex: 0x0135,
+ jcrossedtail: 0x029D,
+ jdotlessstroke: 0x025F,
+ jecyrillic: 0x0458,
+ jeemarabic: 0x062C,
+ jeemfinalarabic: 0xFE9E,
+ jeeminitialarabic: 0xFE9F,
+ jeemmedialarabic: 0xFEA0,
+ jeharabic: 0x0698,
+ jehfinalarabic: 0xFB8B,
+ jhabengali: 0x099D,
+ jhadeva: 0x091D,
+ jhagujarati: 0x0A9D,
+ jhagurmukhi: 0x0A1D,
+ jheharmenian: 0x057B,
+ jis: 0x3004,
+ jmonospace: 0xFF4A,
+ jparen: 0x24A5,
+ jsuperior: 0x02B2,
+ k: 0x006B,
+ kabashkircyrillic: 0x04A1,
+ kabengali: 0x0995,
+ kacute: 0x1E31,
+ kacyrillic: 0x043A,
+ kadescendercyrillic: 0x049B,
+ kadeva: 0x0915,
+ kaf: 0x05DB,
+ kafarabic: 0x0643,
+ kafdagesh: 0xFB3B,
+ kafdageshhebrew: 0xFB3B,
+ kaffinalarabic: 0xFEDA,
+ kafhebrew: 0x05DB,
+ kafinitialarabic: 0xFEDB,
+ kafmedialarabic: 0xFEDC,
+ kafrafehebrew: 0xFB4D,
+ kagujarati: 0x0A95,
+ kagurmukhi: 0x0A15,
+ kahiragana: 0x304B,
+ kahookcyrillic: 0x04C4,
+ kakatakana: 0x30AB,
+ kakatakanahalfwidth: 0xFF76,
+ kappa: 0x03BA,
+ kappasymbolgreek: 0x03F0,
+ kapyeounmieumkorean: 0x3171,
+ kapyeounphieuphkorean: 0x3184,
+ kapyeounpieupkorean: 0x3178,
+ kapyeounssangpieupkorean: 0x3179,
+ karoriisquare: 0x330D,
+ kashidaautoarabic: 0x0640,
+ kashidaautonosidebearingarabic: 0x0640,
+ kasmallkatakana: 0x30F5,
+ kasquare: 0x3384,
+ kasraarabic: 0x0650,
+ kasratanarabic: 0x064D,
+ kastrokecyrillic: 0x049F,
+ katahiraprolongmarkhalfwidth: 0xFF70,
+ kaverticalstrokecyrillic: 0x049D,
+ kbopomofo: 0x310E,
+ kcalsquare: 0x3389,
+ kcaron: 0x01E9,
+ kcedilla: 0x0137,
+ kcircle: 0x24DA,
+ kcommaaccent: 0x0137,
+ kdotbelow: 0x1E33,
+ keharmenian: 0x0584,
+ kehiragana: 0x3051,
+ kekatakana: 0x30B1,
+ kekatakanahalfwidth: 0xFF79,
+ kenarmenian: 0x056F,
+ kesmallkatakana: 0x30F6,
+ kgreenlandic: 0x0138,
+ khabengali: 0x0996,
+ khacyrillic: 0x0445,
+ khadeva: 0x0916,
+ khagujarati: 0x0A96,
+ khagurmukhi: 0x0A16,
+ khaharabic: 0x062E,
+ khahfinalarabic: 0xFEA6,
+ khahinitialarabic: 0xFEA7,
+ khahmedialarabic: 0xFEA8,
+ kheicoptic: 0x03E7,
+ khhadeva: 0x0959,
+ khhagurmukhi: 0x0A59,
+ khieukhacirclekorean: 0x3278,
+ khieukhaparenkorean: 0x3218,
+ khieukhcirclekorean: 0x326A,
+ khieukhkorean: 0x314B,
+ khieukhparenkorean: 0x320A,
+ khokhaithai: 0x0E02,
+ khokhonthai: 0x0E05,
+ khokhuatthai: 0x0E03,
+ khokhwaithai: 0x0E04,
+ khomutthai: 0x0E5B,
+ khook: 0x0199,
+ khorakhangthai: 0x0E06,
+ khzsquare: 0x3391,
+ kihiragana: 0x304D,
+ kikatakana: 0x30AD,
+ kikatakanahalfwidth: 0xFF77,
+ kiroguramusquare: 0x3315,
+ kiromeetorusquare: 0x3316,
+ kirosquare: 0x3314,
+ kiyeokacirclekorean: 0x326E,
+ kiyeokaparenkorean: 0x320E,
+ kiyeokcirclekorean: 0x3260,
+ kiyeokkorean: 0x3131,
+ kiyeokparenkorean: 0x3200,
+ kiyeoksioskorean: 0x3133,
+ kjecyrillic: 0x045C,
+ klinebelow: 0x1E35,
+ klsquare: 0x3398,
+ kmcubedsquare: 0x33A6,
+ kmonospace: 0xFF4B,
+ kmsquaredsquare: 0x33A2,
+ kohiragana: 0x3053,
+ kohmsquare: 0x33C0,
+ kokaithai: 0x0E01,
+ kokatakana: 0x30B3,
+ kokatakanahalfwidth: 0xFF7A,
+ kooposquare: 0x331E,
+ koppacyrillic: 0x0481,
+ koreanstandardsymbol: 0x327F,
+ koroniscmb: 0x0343,
+ kparen: 0x24A6,
+ kpasquare: 0x33AA,
+ ksicyrillic: 0x046F,
+ ktsquare: 0x33CF,
+ kturned: 0x029E,
+ kuhiragana: 0x304F,
+ kukatakana: 0x30AF,
+ kukatakanahalfwidth: 0xFF78,
+ kvsquare: 0x33B8,
+ kwsquare: 0x33BE,
+ l: 0x006C,
+ labengali: 0x09B2,
+ lacute: 0x013A,
+ ladeva: 0x0932,
+ lagujarati: 0x0AB2,
+ lagurmukhi: 0x0A32,
+ lakkhangyaothai: 0x0E45,
+ lamaleffinalarabic: 0xFEFC,
+ lamalefhamzaabovefinalarabic: 0xFEF8,
+ lamalefhamzaaboveisolatedarabic: 0xFEF7,
+ lamalefhamzabelowfinalarabic: 0xFEFA,
+ lamalefhamzabelowisolatedarabic: 0xFEF9,
+ lamalefisolatedarabic: 0xFEFB,
+ lamalefmaddaabovefinalarabic: 0xFEF6,
+ lamalefmaddaaboveisolatedarabic: 0xFEF5,
+ lamarabic: 0x0644,
+ lambda: 0x03BB,
+ lambdastroke: 0x019B,
+ lamed: 0x05DC,
+ lameddagesh: 0xFB3C,
+ lameddageshhebrew: 0xFB3C,
+ lamedhebrew: 0x05DC,
+ lamedholam: 0x05DC05B9,
+ lamedholamdagesh: '05DC 05B9 05BC',
+ lamedholamdageshhebrew: '05DC 05B9 05BC',
+ lamedholamhebrew: 0x05DC05B9,
+ lamfinalarabic: 0xFEDE,
+ lamhahinitialarabic: 0xFCCA,
+ laminitialarabic: 0xFEDF,
+ lamjeeminitialarabic: 0xFCC9,
+ lamkhahinitialarabic: 0xFCCB,
+ lamlamhehisolatedarabic: 0xFDF2,
+ lammedialarabic: 0xFEE0,
+ lammeemhahinitialarabic: 0xFD88,
+ lammeeminitialarabic: 0xFCCC,
+ lammeemjeeminitialarabic: 'FEDF FEE4 FEA0',
+ lammeemkhahinitialarabic: 'FEDF FEE4 FEA8',
+ largecircle: 0x25EF,
+ lbar: 0x019A,
+ lbelt: 0x026C,
+ lbopomofo: 0x310C,
+ lcaron: 0x013E,
+ lcedilla: 0x013C,
+ lcircle: 0x24DB,
+ lcircumflexbelow: 0x1E3D,
+ lcommaaccent: 0x013C,
+ ldot: 0x0140,
+ ldotaccent: 0x0140,
+ ldotbelow: 0x1E37,
+ ldotbelowmacron: 0x1E39,
+ leftangleabovecmb: 0x031A,
+ lefttackbelowcmb: 0x0318,
+ less: 0x003C,
+ lessequal: 0x2264,
+ lessequalorgreater: 0x22DA,
+ lessmonospace: 0xFF1C,
+ lessorequivalent: 0x2272,
+ lessorgreater: 0x2276,
+ lessoverequal: 0x2266,
+ lesssmall: 0xFE64,
+ lezh: 0x026E,
+ lfblock: 0x258C,
+ lhookretroflex: 0x026D,
+ lira: 0x20A4,
+ liwnarmenian: 0x056C,
+ lj: 0x01C9,
+ ljecyrillic: 0x0459,
+ ll: 0xF6C0,
+ lladeva: 0x0933,
+ llagujarati: 0x0AB3,
+ llinebelow: 0x1E3B,
+ llladeva: 0x0934,
+ llvocalicbengali: 0x09E1,
+ llvocalicdeva: 0x0961,
+ llvocalicvowelsignbengali: 0x09E3,
+ llvocalicvowelsigndeva: 0x0963,
+ lmiddletilde: 0x026B,
+ lmonospace: 0xFF4C,
+ lmsquare: 0x33D0,
+ lochulathai: 0x0E2C,
+ logicaland: 0x2227,
+ logicalnot: 0x00AC,
+ logicalnotreversed: 0x2310,
+ logicalor: 0x2228,
+ lolingthai: 0x0E25,
+ longs: 0x017F,
+ lowlinecenterline: 0xFE4E,
+ lowlinecmb: 0x0332,
+ lowlinedashed: 0xFE4D,
+ lozenge: 0x25CA,
+ lparen: 0x24A7,
+ lslash: 0x0142,
+ lsquare: 0x2113,
+ lsuperior: 0xF6EE,
+ ltshade: 0x2591,
+ luthai: 0x0E26,
+ lvocalicbengali: 0x098C,
+ lvocalicdeva: 0x090C,
+ lvocalicvowelsignbengali: 0x09E2,
+ lvocalicvowelsigndeva: 0x0962,
+ lxsquare: 0x33D3,
+ m: 0x006D,
+ mabengali: 0x09AE,
+ macron: 0x00AF,
+ macronbelowcmb: 0x0331,
+ macroncmb: 0x0304,
+ macronlowmod: 0x02CD,
+ macronmonospace: 0xFFE3,
+ macute: 0x1E3F,
+ madeva: 0x092E,
+ magujarati: 0x0AAE,
+ magurmukhi: 0x0A2E,
+ mahapakhhebrew: 0x05A4,
+ mahapakhlefthebrew: 0x05A4,
+ mahiragana: 0x307E,
+ maichattawalowleftthai: 0xF895,
+ maichattawalowrightthai: 0xF894,
+ maichattawathai: 0x0E4B,
+ maichattawaupperleftthai: 0xF893,
+ maieklowleftthai: 0xF88C,
+ maieklowrightthai: 0xF88B,
+ maiekthai: 0x0E48,
+ maiekupperleftthai: 0xF88A,
+ maihanakatleftthai: 0xF884,
+ maihanakatthai: 0x0E31,
+ maitaikhuleftthai: 0xF889,
+ maitaikhuthai: 0x0E47,
+ maitholowleftthai: 0xF88F,
+ maitholowrightthai: 0xF88E,
+ maithothai: 0x0E49,
+ maithoupperleftthai: 0xF88D,
+ maitrilowleftthai: 0xF892,
+ maitrilowrightthai: 0xF891,
+ maitrithai: 0x0E4A,
+ maitriupperleftthai: 0xF890,
+ maiyamokthai: 0x0E46,
+ makatakana: 0x30DE,
+ makatakanahalfwidth: 0xFF8F,
+ male: 0x2642,
+ mansyonsquare: 0x3347,
+ maqafhebrew: 0x05BE,
+ mars: 0x2642,
+ masoracirclehebrew: 0x05AF,
+ masquare: 0x3383,
+ mbopomofo: 0x3107,
+ mbsquare: 0x33D4,
+ mcircle: 0x24DC,
+ mcubedsquare: 0x33A5,
+ mdotaccent: 0x1E41,
+ mdotbelow: 0x1E43,
+ meemarabic: 0x0645,
+ meemfinalarabic: 0xFEE2,
+ meeminitialarabic: 0xFEE3,
+ meemmedialarabic: 0xFEE4,
+ meemmeeminitialarabic: 0xFCD1,
+ meemmeemisolatedarabic: 0xFC48,
+ meetorusquare: 0x334D,
+ mehiragana: 0x3081,
+ meizierasquare: 0x337E,
+ mekatakana: 0x30E1,
+ mekatakanahalfwidth: 0xFF92,
+ mem: 0x05DE,
+ memdagesh: 0xFB3E,
+ memdageshhebrew: 0xFB3E,
+ memhebrew: 0x05DE,
+ menarmenian: 0x0574,
+ merkhahebrew: 0x05A5,
+ merkhakefulahebrew: 0x05A6,
+ merkhakefulalefthebrew: 0x05A6,
+ merkhalefthebrew: 0x05A5,
+ mhook: 0x0271,
+ mhzsquare: 0x3392,
+ middledotkatakanahalfwidth: 0xFF65,
+ middot: 0x00B7,
+ mieumacirclekorean: 0x3272,
+ mieumaparenkorean: 0x3212,
+ mieumcirclekorean: 0x3264,
+ mieumkorean: 0x3141,
+ mieumpansioskorean: 0x3170,
+ mieumparenkorean: 0x3204,
+ mieumpieupkorean: 0x316E,
+ mieumsioskorean: 0x316F,
+ mihiragana: 0x307F,
+ mikatakana: 0x30DF,
+ mikatakanahalfwidth: 0xFF90,
+ minus: 0x2212,
+ minusbelowcmb: 0x0320,
+ minuscircle: 0x2296,
+ minusmod: 0x02D7,
+ minusplus: 0x2213,
+ minute: 0x2032,
+ miribaarusquare: 0x334A,
+ mirisquare: 0x3349,
+ mlonglegturned: 0x0270,
+ mlsquare: 0x3396,
+ mmcubedsquare: 0x33A3,
+ mmonospace: 0xFF4D,
+ mmsquaredsquare: 0x339F,
+ mohiragana: 0x3082,
+ mohmsquare: 0x33C1,
+ mokatakana: 0x30E2,
+ mokatakanahalfwidth: 0xFF93,
+ molsquare: 0x33D6,
+ momathai: 0x0E21,
+ moverssquare: 0x33A7,
+ moverssquaredsquare: 0x33A8,
+ mparen: 0x24A8,
+ mpasquare: 0x33AB,
+ mssquare: 0x33B3,
+ msuperior: 0xF6EF,
+ mturned: 0x026F,
+ mu: 0x00B5,
+ mu1: 0x00B5,
+ muasquare: 0x3382,
+ muchgreater: 0x226B,
+ muchless: 0x226A,
+ mufsquare: 0x338C,
+ mugreek: 0x03BC,
+ mugsquare: 0x338D,
+ muhiragana: 0x3080,
+ mukatakana: 0x30E0,
+ mukatakanahalfwidth: 0xFF91,
+ mulsquare: 0x3395,
+ multiply: 0x00D7,
+ mumsquare: 0x339B,
+ munahhebrew: 0x05A3,
+ munahlefthebrew: 0x05A3,
+ musicalnote: 0x266A,
+ musicalnotedbl: 0x266B,
+ musicflatsign: 0x266D,
+ musicsharpsign: 0x266F,
+ mussquare: 0x33B2,
+ muvsquare: 0x33B6,
+ muwsquare: 0x33BC,
+ mvmegasquare: 0x33B9,
+ mvsquare: 0x33B7,
+ mwmegasquare: 0x33BF,
+ mwsquare: 0x33BD,
+ n: 0x006E,
+ nabengali: 0x09A8,
+ nabla: 0x2207,
+ nacute: 0x0144,
+ nadeva: 0x0928,
+ nagujarati: 0x0AA8,
+ nagurmukhi: 0x0A28,
+ nahiragana: 0x306A,
+ nakatakana: 0x30CA,
+ nakatakanahalfwidth: 0xFF85,
+ napostrophe: 0x0149,
+ nasquare: 0x3381,
+ nbopomofo: 0x310B,
+ nbspace: 0x00A0,
+ ncaron: 0x0148,
+ ncedilla: 0x0146,
+ ncircle: 0x24DD,
+ ncircumflexbelow: 0x1E4B,
+ ncommaaccent: 0x0146,
+ ndotaccent: 0x1E45,
+ ndotbelow: 0x1E47,
+ nehiragana: 0x306D,
+ nekatakana: 0x30CD,
+ nekatakanahalfwidth: 0xFF88,
+ newsheqelsign: 0x20AA,
+ nfsquare: 0x338B,
+ ngabengali: 0x0999,
+ ngadeva: 0x0919,
+ ngagujarati: 0x0A99,
+ ngagurmukhi: 0x0A19,
+ ngonguthai: 0x0E07,
+ nhiragana: 0x3093,
+ nhookleft: 0x0272,
+ nhookretroflex: 0x0273,
+ nieunacirclekorean: 0x326F,
+ nieunaparenkorean: 0x320F,
+ nieuncieuckorean: 0x3135,
+ nieuncirclekorean: 0x3261,
+ nieunhieuhkorean: 0x3136,
+ nieunkorean: 0x3134,
+ nieunpansioskorean: 0x3168,
+ nieunparenkorean: 0x3201,
+ nieunsioskorean: 0x3167,
+ nieuntikeutkorean: 0x3166,
+ nihiragana: 0x306B,
+ nikatakana: 0x30CB,
+ nikatakanahalfwidth: 0xFF86,
+ nikhahitleftthai: 0xF899,
+ nikhahitthai: 0x0E4D,
+ nine: 0x0039,
+ ninearabic: 0x0669,
+ ninebengali: 0x09EF,
+ ninecircle: 0x2468,
+ ninecircleinversesansserif: 0x2792,
+ ninedeva: 0x096F,
+ ninegujarati: 0x0AEF,
+ ninegurmukhi: 0x0A6F,
+ ninehackarabic: 0x0669,
+ ninehangzhou: 0x3029,
+ nineideographicparen: 0x3228,
+ nineinferior: 0x2089,
+ ninemonospace: 0xFF19,
+ nineoldstyle: 0xF739,
+ nineparen: 0x247C,
+ nineperiod: 0x2490,
+ ninepersian: 0x06F9,
+ nineroman: 0x2178,
+ ninesuperior: 0x2079,
+ nineteencircle: 0x2472,
+ nineteenparen: 0x2486,
+ nineteenperiod: 0x249A,
+ ninethai: 0x0E59,
+ nj: 0x01CC,
+ njecyrillic: 0x045A,
+ nkatakana: 0x30F3,
+ nkatakanahalfwidth: 0xFF9D,
+ nlegrightlong: 0x019E,
+ nlinebelow: 0x1E49,
+ nmonospace: 0xFF4E,
+ nmsquare: 0x339A,
+ nnabengali: 0x09A3,
+ nnadeva: 0x0923,
+ nnagujarati: 0x0AA3,
+ nnagurmukhi: 0x0A23,
+ nnnadeva: 0x0929,
+ nohiragana: 0x306E,
+ nokatakana: 0x30CE,
+ nokatakanahalfwidth: 0xFF89,
+ nonbreakingspace: 0x00A0,
+ nonenthai: 0x0E13,
+ nonuthai: 0x0E19,
+ noonarabic: 0x0646,
+ noonfinalarabic: 0xFEE6,
+ noonghunnaarabic: 0x06BA,
+ noonghunnafinalarabic: 0xFB9F,
+ noonhehinitialarabic: 0xFEE7FEEC,
+ nooninitialarabic: 0xFEE7,
+ noonjeeminitialarabic: 0xFCD2,
+ noonjeemisolatedarabic: 0xFC4B,
+ noonmedialarabic: 0xFEE8,
+ noonmeeminitialarabic: 0xFCD5,
+ noonmeemisolatedarabic: 0xFC4E,
+ noonnoonfinalarabic: 0xFC8D,
+ notcontains: 0x220C,
+ notelement: 0x2209,
+ notelementof: 0x2209,
+ notequal: 0x2260,
+ notgreater: 0x226F,
+ notgreaternorequal: 0x2271,
+ notgreaternorless: 0x2279,
+ notidentical: 0x2262,
+ notless: 0x226E,
+ notlessnorequal: 0x2270,
+ notparallel: 0x2226,
+ notprecedes: 0x2280,
+ notsubset: 0x2284,
+ notsucceeds: 0x2281,
+ notsuperset: 0x2285,
+ nowarmenian: 0x0576,
+ nparen: 0x24A9,
+ nssquare: 0x33B1,
+ nsuperior: 0x207F,
+ ntilde: 0x00F1,
+ nu: 0x03BD,
+ nuhiragana: 0x306C,
+ nukatakana: 0x30CC,
+ nukatakanahalfwidth: 0xFF87,
+ nuktabengali: 0x09BC,
+ nuktadeva: 0x093C,
+ nuktagujarati: 0x0ABC,
+ nuktagurmukhi: 0x0A3C,
+ numbersign: 0x0023,
+ numbersignmonospace: 0xFF03,
+ numbersignsmall: 0xFE5F,
+ numeralsigngreek: 0x0374,
+ numeralsignlowergreek: 0x0375,
+ numero: 0x2116,
+ nun: 0x05E0,
+ nundagesh: 0xFB40,
+ nundageshhebrew: 0xFB40,
+ nunhebrew: 0x05E0,
+ nvsquare: 0x33B5,
+ nwsquare: 0x33BB,
+ nyabengali: 0x099E,
+ nyadeva: 0x091E,
+ nyagujarati: 0x0A9E,
+ nyagurmukhi: 0x0A1E,
+ o: 0x006F,
+ oacute: 0x00F3,
+ oangthai: 0x0E2D,
+ obarred: 0x0275,
+ obarredcyrillic: 0x04E9,
+ obarreddieresiscyrillic: 0x04EB,
+ obengali: 0x0993,
+ obopomofo: 0x311B,
+ obreve: 0x014F,
+ ocandradeva: 0x0911,
+ ocandragujarati: 0x0A91,
+ ocandravowelsigndeva: 0x0949,
+ ocandravowelsigngujarati: 0x0AC9,
+ ocaron: 0x01D2,
+ ocircle: 0x24DE,
+ ocircumflex: 0x00F4,
+ ocircumflexacute: 0x1ED1,
+ ocircumflexdotbelow: 0x1ED9,
+ ocircumflexgrave: 0x1ED3,
+ ocircumflexhookabove: 0x1ED5,
+ ocircumflextilde: 0x1ED7,
+ ocyrillic: 0x043E,
+ odblacute: 0x0151,
+ odblgrave: 0x020D,
+ odeva: 0x0913,
+ odieresis: 0x00F6,
+ odieresiscyrillic: 0x04E7,
+ odotbelow: 0x1ECD,
+ oe: 0x0153,
+ oekorean: 0x315A,
+ ogonek: 0x02DB,
+ ogonekcmb: 0x0328,
+ ograve: 0x00F2,
+ ogujarati: 0x0A93,
+ oharmenian: 0x0585,
+ ohiragana: 0x304A,
+ ohookabove: 0x1ECF,
+ ohorn: 0x01A1,
+ ohornacute: 0x1EDB,
+ ohorndotbelow: 0x1EE3,
+ ohorngrave: 0x1EDD,
+ ohornhookabove: 0x1EDF,
+ ohorntilde: 0x1EE1,
+ ohungarumlaut: 0x0151,
+ oi: 0x01A3,
+ oinvertedbreve: 0x020F,
+ okatakana: 0x30AA,
+ okatakanahalfwidth: 0xFF75,
+ okorean: 0x3157,
+ olehebrew: 0x05AB,
+ omacron: 0x014D,
+ omacronacute: 0x1E53,
+ omacrongrave: 0x1E51,
+ omdeva: 0x0950,
+ omega: 0x03C9,
+ omega1: 0x03D6,
+ omegacyrillic: 0x0461,
+ omegalatinclosed: 0x0277,
+ omegaroundcyrillic: 0x047B,
+ omegatitlocyrillic: 0x047D,
+ omegatonos: 0x03CE,
+ omgujarati: 0x0AD0,
+ omicron: 0x03BF,
+ omicrontonos: 0x03CC,
+ omonospace: 0xFF4F,
+ one: 0x0031,
+ onearabic: 0x0661,
+ onebengali: 0x09E7,
+ onecircle: 0x2460,
+ onecircleinversesansserif: 0x278A,
+ onedeva: 0x0967,
+ onedotenleader: 0x2024,
+ oneeighth: 0x215B,
+ onefitted: 0xF6DC,
+ onegujarati: 0x0AE7,
+ onegurmukhi: 0x0A67,
+ onehackarabic: 0x0661,
+ onehalf: 0x00BD,
+ onehangzhou: 0x3021,
+ oneideographicparen: 0x3220,
+ oneinferior: 0x2081,
+ onemonospace: 0xFF11,
+ onenumeratorbengali: 0x09F4,
+ oneoldstyle: 0xF731,
+ oneparen: 0x2474,
+ oneperiod: 0x2488,
+ onepersian: 0x06F1,
+ onequarter: 0x00BC,
+ oneroman: 0x2170,
+ onesuperior: 0x00B9,
+ onethai: 0x0E51,
+ onethird: 0x2153,
+ oogonek: 0x01EB,
+ oogonekmacron: 0x01ED,
+ oogurmukhi: 0x0A13,
+ oomatragurmukhi: 0x0A4B,
+ oopen: 0x0254,
+ oparen: 0x24AA,
+ openbullet: 0x25E6,
+ option: 0x2325,
+ ordfeminine: 0x00AA,
+ ordmasculine: 0x00BA,
+ orthogonal: 0x221F,
+ oshortdeva: 0x0912,
+ oshortvowelsigndeva: 0x094A,
+ oslash: 0x00F8,
+ oslashacute: 0x01FF,
+ osmallhiragana: 0x3049,
+ osmallkatakana: 0x30A9,
+ osmallkatakanahalfwidth: 0xFF6B,
+ ostrokeacute: 0x01FF,
+ osuperior: 0xF6F0,
+ otcyrillic: 0x047F,
+ otilde: 0x00F5,
+ otildeacute: 0x1E4D,
+ otildedieresis: 0x1E4F,
+ oubopomofo: 0x3121,
+ overline: 0x203E,
+ overlinecenterline: 0xFE4A,
+ overlinecmb: 0x0305,
+ overlinedashed: 0xFE49,
+ overlinedblwavy: 0xFE4C,
+ overlinewavy: 0xFE4B,
+ overscore: 0x00AF,
+ ovowelsignbengali: 0x09CB,
+ ovowelsigndeva: 0x094B,
+ ovowelsigngujarati: 0x0ACB,
+ p: 0x0070,
+ paampssquare: 0x3380,
+ paasentosquare: 0x332B,
+ pabengali: 0x09AA,
+ pacute: 0x1E55,
+ padeva: 0x092A,
+ pagedown: 0x21DF,
+ pageup: 0x21DE,
+ pagujarati: 0x0AAA,
+ pagurmukhi: 0x0A2A,
+ pahiragana: 0x3071,
+ paiyannoithai: 0x0E2F,
+ pakatakana: 0x30D1,
+ palatalizationcyrilliccmb: 0x0484,
+ palochkacyrillic: 0x04C0,
+ pansioskorean: 0x317F,
+ paragraph: 0x00B6,
+ parallel: 0x2225,
+ parenleft: 0x0028,
+ parenleftaltonearabic: 0xFD3E,
+ parenleftbt: 0xF8ED,
+ parenleftex: 0xF8EC,
+ parenleftinferior: 0x208D,
+ parenleftmonospace: 0xFF08,
+ parenleftsmall: 0xFE59,
+ parenleftsuperior: 0x207D,
+ parenlefttp: 0xF8EB,
+ parenleftvertical: 0xFE35,
+ parenright: 0x0029,
+ parenrightaltonearabic: 0xFD3F,
+ parenrightbt: 0xF8F8,
+ parenrightex: 0xF8F7,
+ parenrightinferior: 0x208E,
+ parenrightmonospace: 0xFF09,
+ parenrightsmall: 0xFE5A,
+ parenrightsuperior: 0x207E,
+ parenrighttp: 0xF8F6,
+ parenrightvertical: 0xFE36,
+ partialdiff: 0x2202,
+ paseqhebrew: 0x05C0,
+ pashtahebrew: 0x0599,
+ pasquare: 0x33A9,
+ patah: 0x05B7,
+ patah11: 0x05B7,
+ patah1d: 0x05B7,
+ patah2a: 0x05B7,
+ patahhebrew: 0x05B7,
+ patahnarrowhebrew: 0x05B7,
+ patahquarterhebrew: 0x05B7,
+ patahwidehebrew: 0x05B7,
+ pazerhebrew: 0x05A1,
+ pbopomofo: 0x3106,
+ pcircle: 0x24DF,
+ pdotaccent: 0x1E57,
+ pe: 0x05E4,
+ pecyrillic: 0x043F,
+ pedagesh: 0xFB44,
+ pedageshhebrew: 0xFB44,
+ peezisquare: 0x333B,
+ pefinaldageshhebrew: 0xFB43,
+ peharabic: 0x067E,
+ peharmenian: 0x057A,
+ pehebrew: 0x05E4,
+ pehfinalarabic: 0xFB57,
+ pehinitialarabic: 0xFB58,
+ pehiragana: 0x307A,
+ pehmedialarabic: 0xFB59,
+ pekatakana: 0x30DA,
+ pemiddlehookcyrillic: 0x04A7,
+ perafehebrew: 0xFB4E,
+ percent: 0x0025,
+ percentarabic: 0x066A,
+ percentmonospace: 0xFF05,
+ percentsmall: 0xFE6A,
+ period: 0x002E,
+ periodarmenian: 0x0589,
+ periodcentered: 0x00B7,
+ periodhalfwidth: 0xFF61,
+ periodinferior: 0xF6E7,
+ periodmonospace: 0xFF0E,
+ periodsmall: 0xFE52,
+ periodsuperior: 0xF6E8,
+ perispomenigreekcmb: 0x0342,
+ perpendicular: 0x22A5,
+ perthousand: 0x2030,
+ peseta: 0x20A7,
+ pfsquare: 0x338A,
+ phabengali: 0x09AB,
+ phadeva: 0x092B,
+ phagujarati: 0x0AAB,
+ phagurmukhi: 0x0A2B,
+ phi: 0x03C6,
+ phi1: 0x03D5,
+ phieuphacirclekorean: 0x327A,
+ phieuphaparenkorean: 0x321A,
+ phieuphcirclekorean: 0x326C,
+ phieuphkorean: 0x314D,
+ phieuphparenkorean: 0x320C,
+ philatin: 0x0278,
+ phinthuthai: 0x0E3A,
+ phisymbolgreek: 0x03D5,
+ phook: 0x01A5,
+ phophanthai: 0x0E1E,
+ phophungthai: 0x0E1C,
+ phosamphaothai: 0x0E20,
+ pi: 0x03C0,
+ pieupacirclekorean: 0x3273,
+ pieupaparenkorean: 0x3213,
+ pieupcieuckorean: 0x3176,
+ pieupcirclekorean: 0x3265,
+ pieupkiyeokkorean: 0x3172,
+ pieupkorean: 0x3142,
+ pieupparenkorean: 0x3205,
+ pieupsioskiyeokkorean: 0x3174,
+ pieupsioskorean: 0x3144,
+ pieupsiostikeutkorean: 0x3175,
+ pieupthieuthkorean: 0x3177,
+ pieuptikeutkorean: 0x3173,
+ pihiragana: 0x3074,
+ pikatakana: 0x30D4,
+ pisymbolgreek: 0x03D6,
+ piwrarmenian: 0x0583,
+ plus: 0x002B,
+ plusbelowcmb: 0x031F,
+ pluscircle: 0x2295,
+ plusminus: 0x00B1,
+ plusmod: 0x02D6,
+ plusmonospace: 0xFF0B,
+ plussmall: 0xFE62,
+ plussuperior: 0x207A,
+ pmonospace: 0xFF50,
+ pmsquare: 0x33D8,
+ pohiragana: 0x307D,
+ pointingindexdownwhite: 0x261F,
+ pointingindexleftwhite: 0x261C,
+ pointingindexrightwhite: 0x261E,
+ pointingindexupwhite: 0x261D,
+ pokatakana: 0x30DD,
+ poplathai: 0x0E1B,
+ postalmark: 0x3012,
+ postalmarkface: 0x3020,
+ pparen: 0x24AB,
+ precedes: 0x227A,
+ prescription: 0x211E,
+ primemod: 0x02B9,
+ primereversed: 0x2035,
+ product: 0x220F,
+ projective: 0x2305,
+ prolongedkana: 0x30FC,
+ propellor: 0x2318,
+ propersubset: 0x2282,
+ propersuperset: 0x2283,
+ proportion: 0x2237,
+ proportional: 0x221D,
+ psi: 0x03C8,
+ psicyrillic: 0x0471,
+ psilipneumatacyrilliccmb: 0x0486,
+ pssquare: 0x33B0,
+ puhiragana: 0x3077,
+ pukatakana: 0x30D7,
+ pvsquare: 0x33B4,
+ pwsquare: 0x33BA,
+ q: 0x0071,
+ qadeva: 0x0958,
+ qadmahebrew: 0x05A8,
+ qafarabic: 0x0642,
+ qaffinalarabic: 0xFED6,
+ qafinitialarabic: 0xFED7,
+ qafmedialarabic: 0xFED8,
+ qamats: 0x05B8,
+ qamats10: 0x05B8,
+ qamats1a: 0x05B8,
+ qamats1c: 0x05B8,
+ qamats27: 0x05B8,
+ qamats29: 0x05B8,
+ qamats33: 0x05B8,
+ qamatsde: 0x05B8,
+ qamatshebrew: 0x05B8,
+ qamatsnarrowhebrew: 0x05B8,
+ qamatsqatanhebrew: 0x05B8,
+ qamatsqatannarrowhebrew: 0x05B8,
+ qamatsqatanquarterhebrew: 0x05B8,
+ qamatsqatanwidehebrew: 0x05B8,
+ qamatsquarterhebrew: 0x05B8,
+ qamatswidehebrew: 0x05B8,
+ qarneyparahebrew: 0x059F,
+ qbopomofo: 0x3111,
+ qcircle: 0x24E0,
+ qhook: 0x02A0,
+ qmonospace: 0xFF51,
+ qof: 0x05E7,
+ qofdagesh: 0xFB47,
+ qofdageshhebrew: 0xFB47,
+ qofhatafpatah: 0x05E705B2,
+ qofhatafpatahhebrew: 0x05E705B2,
+ qofhatafsegol: 0x05E705B1,
+ qofhatafsegolhebrew: 0x05E705B1,
+ qofhebrew: 0x05E7,
+ qofhiriq: 0x05E705B4,
+ qofhiriqhebrew: 0x05E705B4,
+ qofholam: 0x05E705B9,
+ qofholamhebrew: 0x05E705B9,
+ qofpatah: 0x05E705B7,
+ qofpatahhebrew: 0x05E705B7,
+ qofqamats: 0x05E705B8,
+ qofqamatshebrew: 0x05E705B8,
+ qofqubuts: 0x05E705BB,
+ qofqubutshebrew: 0x05E705BB,
+ qofsegol: 0x05E705B6,
+ qofsegolhebrew: 0x05E705B6,
+ qofsheva: 0x05E705B0,
+ qofshevahebrew: 0x05E705B0,
+ qoftsere: 0x05E705B5,
+ qoftserehebrew: 0x05E705B5,
+ qparen: 0x24AC,
+ quarternote: 0x2669,
+ qubuts: 0x05BB,
+ qubuts18: 0x05BB,
+ qubuts25: 0x05BB,
+ qubuts31: 0x05BB,
+ qubutshebrew: 0x05BB,
+ qubutsnarrowhebrew: 0x05BB,
+ qubutsquarterhebrew: 0x05BB,
+ qubutswidehebrew: 0x05BB,
+ question: 0x003F,
+ questionarabic: 0x061F,
+ questionarmenian: 0x055E,
+ questiondown: 0x00BF,
+ questiondownsmall: 0xF7BF,
+ questiongreek: 0x037E,
+ questionmonospace: 0xFF1F,
+ questionsmall: 0xF73F,
+ quotedbl: 0x0022,
+ quotedblbase: 0x201E,
+ quotedblleft: 0x201C,
+ quotedblmonospace: 0xFF02,
+ quotedblprime: 0x301E,
+ quotedblprimereversed: 0x301D,
+ quotedblright: 0x201D,
+ quoteleft: 0x2018,
+ quoteleftreversed: 0x201B,
+ quotereversed: 0x201B,
+ quoteright: 0x2019,
+ quoterightn: 0x0149,
+ quotesinglbase: 0x201A,
+ quotesingle: 0x0027,
+ quotesinglemonospace: 0xFF07,
+ r: 0x0072,
+ raarmenian: 0x057C,
+ rabengali: 0x09B0,
+ racute: 0x0155,
+ radeva: 0x0930,
+ radical: 0x221A,
+ radicalex: 0xF8E5,
+ radoverssquare: 0x33AE,
+ radoverssquaredsquare: 0x33AF,
+ radsquare: 0x33AD,
+ rafe: 0x05BF,
+ rafehebrew: 0x05BF,
+ ragujarati: 0x0AB0,
+ ragurmukhi: 0x0A30,
+ rahiragana: 0x3089,
+ rakatakana: 0x30E9,
+ rakatakanahalfwidth: 0xFF97,
+ ralowerdiagonalbengali: 0x09F1,
+ ramiddlediagonalbengali: 0x09F0,
+ ramshorn: 0x0264,
+ ratio: 0x2236,
+ rbopomofo: 0x3116,
+ rcaron: 0x0159,
+ rcedilla: 0x0157,
+ rcircle: 0x24E1,
+ rcommaaccent: 0x0157,
+ rdblgrave: 0x0211,
+ rdotaccent: 0x1E59,
+ rdotbelow: 0x1E5B,
+ rdotbelowmacron: 0x1E5D,
+ referencemark: 0x203B,
+ reflexsubset: 0x2286,
+ reflexsuperset: 0x2287,
+ registered: 0x00AE,
+ registersans: 0xF8E8,
+ registerserif: 0xF6DA,
+ reharabic: 0x0631,
+ reharmenian: 0x0580,
+ rehfinalarabic: 0xFEAE,
+ rehiragana: 0x308C,
+ rehyehaleflamarabic: '0631 FEF3 FE8E 0644',
+ rekatakana: 0x30EC,
+ rekatakanahalfwidth: 0xFF9A,
+ resh: 0x05E8,
+ reshdageshhebrew: 0xFB48,
+ reshhatafpatah: 0x05E805B2,
+ reshhatafpatahhebrew: 0x05E805B2,
+ reshhatafsegol: 0x05E805B1,
+ reshhatafsegolhebrew: 0x05E805B1,
+ reshhebrew: 0x05E8,
+ reshhiriq: 0x05E805B4,
+ reshhiriqhebrew: 0x05E805B4,
+ reshholam: 0x05E805B9,
+ reshholamhebrew: 0x05E805B9,
+ reshpatah: 0x05E805B7,
+ reshpatahhebrew: 0x05E805B7,
+ reshqamats: 0x05E805B8,
+ reshqamatshebrew: 0x05E805B8,
+ reshqubuts: 0x05E805BB,
+ reshqubutshebrew: 0x05E805BB,
+ reshsegol: 0x05E805B6,
+ reshsegolhebrew: 0x05E805B6,
+ reshsheva: 0x05E805B0,
+ reshshevahebrew: 0x05E805B0,
+ reshtsere: 0x05E805B5,
+ reshtserehebrew: 0x05E805B5,
+ reversedtilde: 0x223D,
+ reviahebrew: 0x0597,
+ reviamugrashhebrew: 0x0597,
+ revlogicalnot: 0x2310,
+ rfishhook: 0x027E,
+ rfishhookreversed: 0x027F,
+ rhabengali: 0x09DD,
+ rhadeva: 0x095D,
+ rho: 0x03C1,
+ rhook: 0x027D,
+ rhookturned: 0x027B,
+ rhookturnedsuperior: 0x02B5,
+ rhosymbolgreek: 0x03F1,
+ rhotichookmod: 0x02DE,
+ rieulacirclekorean: 0x3271,
+ rieulaparenkorean: 0x3211,
+ rieulcirclekorean: 0x3263,
+ rieulhieuhkorean: 0x3140,
+ rieulkiyeokkorean: 0x313A,
+ rieulkiyeoksioskorean: 0x3169,
+ rieulkorean: 0x3139,
+ rieulmieumkorean: 0x313B,
+ rieulpansioskorean: 0x316C,
+ rieulparenkorean: 0x3203,
+ rieulphieuphkorean: 0x313F,
+ rieulpieupkorean: 0x313C,
+ rieulpieupsioskorean: 0x316B,
+ rieulsioskorean: 0x313D,
+ rieulthieuthkorean: 0x313E,
+ rieultikeutkorean: 0x316A,
+ rieulyeorinhieuhkorean: 0x316D,
+ rightangle: 0x221F,
+ righttackbelowcmb: 0x0319,
+ righttriangle: 0x22BF,
+ rihiragana: 0x308A,
+ rikatakana: 0x30EA,
+ rikatakanahalfwidth: 0xFF98,
+ ring: 0x02DA,
+ ringbelowcmb: 0x0325,
+ ringcmb: 0x030A,
+ ringhalfleft: 0x02BF,
+ ringhalfleftarmenian: 0x0559,
+ ringhalfleftbelowcmb: 0x031C,
+ ringhalfleftcentered: 0x02D3,
+ ringhalfright: 0x02BE,
+ ringhalfrightbelowcmb: 0x0339,
+ ringhalfrightcentered: 0x02D2,
+ rinvertedbreve: 0x0213,
+ rittorusquare: 0x3351,
+ rlinebelow: 0x1E5F,
+ rlongleg: 0x027C,
+ rlonglegturned: 0x027A,
+ rmonospace: 0xFF52,
+ rohiragana: 0x308D,
+ rokatakana: 0x30ED,
+ rokatakanahalfwidth: 0xFF9B,
+ roruathai: 0x0E23,
+ rparen: 0x24AD,
+ rrabengali: 0x09DC,
+ rradeva: 0x0931,
+ rragurmukhi: 0x0A5C,
+ rreharabic: 0x0691,
+ rrehfinalarabic: 0xFB8D,
+ rrvocalicbengali: 0x09E0,
+ rrvocalicdeva: 0x0960,
+ rrvocalicgujarati: 0x0AE0,
+ rrvocalicvowelsignbengali: 0x09C4,
+ rrvocalicvowelsigndeva: 0x0944,
+ rrvocalicvowelsigngujarati: 0x0AC4,
+ rsuperior: 0xF6F1,
+ rtblock: 0x2590,
+ rturned: 0x0279,
+ rturnedsuperior: 0x02B4,
+ ruhiragana: 0x308B,
+ rukatakana: 0x30EB,
+ rukatakanahalfwidth: 0xFF99,
+ rupeemarkbengali: 0x09F2,
+ rupeesignbengali: 0x09F3,
+ rupiah: 0xF6DD,
+ ruthai: 0x0E24,
+ rvocalicbengali: 0x098B,
+ rvocalicdeva: 0x090B,
+ rvocalicgujarati: 0x0A8B,
+ rvocalicvowelsignbengali: 0x09C3,
+ rvocalicvowelsigndeva: 0x0943,
+ rvocalicvowelsigngujarati: 0x0AC3,
+ s: 0x0073,
+ sabengali: 0x09B8,
+ sacute: 0x015B,
+ sacutedotaccent: 0x1E65,
+ sadarabic: 0x0635,
+ sadeva: 0x0938,
+ sadfinalarabic: 0xFEBA,
+ sadinitialarabic: 0xFEBB,
+ sadmedialarabic: 0xFEBC,
+ sagujarati: 0x0AB8,
+ sagurmukhi: 0x0A38,
+ sahiragana: 0x3055,
+ sakatakana: 0x30B5,
+ sakatakanahalfwidth: 0xFF7B,
+ sallallahoualayhewasallamarabic: 0xFDFA,
+ samekh: 0x05E1,
+ samekhdagesh: 0xFB41,
+ samekhdageshhebrew: 0xFB41,
+ samekhhebrew: 0x05E1,
+ saraaathai: 0x0E32,
+ saraaethai: 0x0E41,
+ saraaimaimalaithai: 0x0E44,
+ saraaimaimuanthai: 0x0E43,
+ saraamthai: 0x0E33,
+ saraathai: 0x0E30,
+ saraethai: 0x0E40,
+ saraiileftthai: 0xF886,
+ saraiithai: 0x0E35,
+ saraileftthai: 0xF885,
+ saraithai: 0x0E34,
+ saraothai: 0x0E42,
+ saraueeleftthai: 0xF888,
+ saraueethai: 0x0E37,
+ saraueleftthai: 0xF887,
+ sarauethai: 0x0E36,
+ sarauthai: 0x0E38,
+ sarauuthai: 0x0E39,
+ sbopomofo: 0x3119,
+ scaron: 0x0161,
+ scarondotaccent: 0x1E67,
+ scedilla: 0x015F,
+ schwa: 0x0259,
+ schwacyrillic: 0x04D9,
+ schwadieresiscyrillic: 0x04DB,
+ schwahook: 0x025A,
+ scircle: 0x24E2,
+ scircumflex: 0x015D,
+ scommaaccent: 0x0219,
+ sdotaccent: 0x1E61,
+ sdotbelow: 0x1E63,
+ sdotbelowdotaccent: 0x1E69,
+ seagullbelowcmb: 0x033C,
+ second: 0x2033,
+ secondtonechinese: 0x02CA,
+ section: 0x00A7,
+ seenarabic: 0x0633,
+ seenfinalarabic: 0xFEB2,
+ seeninitialarabic: 0xFEB3,
+ seenmedialarabic: 0xFEB4,
+ segol: 0x05B6,
+ segol13: 0x05B6,
+ segol1f: 0x05B6,
+ segol2c: 0x05B6,
+ segolhebrew: 0x05B6,
+ segolnarrowhebrew: 0x05B6,
+ segolquarterhebrew: 0x05B6,
+ segoltahebrew: 0x0592,
+ segolwidehebrew: 0x05B6,
+ seharmenian: 0x057D,
+ sehiragana: 0x305B,
+ sekatakana: 0x30BB,
+ sekatakanahalfwidth: 0xFF7E,
+ semicolon: 0x003B,
+ semicolonarabic: 0x061B,
+ semicolonmonospace: 0xFF1B,
+ semicolonsmall: 0xFE54,
+ semivoicedmarkkana: 0x309C,
+ semivoicedmarkkanahalfwidth: 0xFF9F,
+ sentisquare: 0x3322,
+ sentosquare: 0x3323,
+ seven: 0x0037,
+ sevenarabic: 0x0667,
+ sevenbengali: 0x09ED,
+ sevencircle: 0x2466,
+ sevencircleinversesansserif: 0x2790,
+ sevendeva: 0x096D,
+ seveneighths: 0x215E,
+ sevengujarati: 0x0AED,
+ sevengurmukhi: 0x0A6D,
+ sevenhackarabic: 0x0667,
+ sevenhangzhou: 0x3027,
+ sevenideographicparen: 0x3226,
+ seveninferior: 0x2087,
+ sevenmonospace: 0xFF17,
+ sevenoldstyle: 0xF737,
+ sevenparen: 0x247A,
+ sevenperiod: 0x248E,
+ sevenpersian: 0x06F7,
+ sevenroman: 0x2176,
+ sevensuperior: 0x2077,
+ seventeencircle: 0x2470,
+ seventeenparen: 0x2484,
+ seventeenperiod: 0x2498,
+ seventhai: 0x0E57,
+ sfthyphen: 0x00AD,
+ shaarmenian: 0x0577,
+ shabengali: 0x09B6,
+ shacyrillic: 0x0448,
+ shaddaarabic: 0x0651,
+ shaddadammaarabic: 0xFC61,
+ shaddadammatanarabic: 0xFC5E,
+ shaddafathaarabic: 0xFC60,
+ shaddafathatanarabic: 0x0651064B,
+ shaddakasraarabic: 0xFC62,
+ shaddakasratanarabic: 0xFC5F,
+ shade: 0x2592,
+ shadedark: 0x2593,
+ shadelight: 0x2591,
+ shademedium: 0x2592,
+ shadeva: 0x0936,
+ shagujarati: 0x0AB6,
+ shagurmukhi: 0x0A36,
+ shalshelethebrew: 0x0593,
+ shbopomofo: 0x3115,
+ shchacyrillic: 0x0449,
+ sheenarabic: 0x0634,
+ sheenfinalarabic: 0xFEB6,
+ sheeninitialarabic: 0xFEB7,
+ sheenmedialarabic: 0xFEB8,
+ sheicoptic: 0x03E3,
+ sheqel: 0x20AA,
+ sheqelhebrew: 0x20AA,
+ sheva: 0x05B0,
+ sheva115: 0x05B0,
+ sheva15: 0x05B0,
+ sheva22: 0x05B0,
+ sheva2e: 0x05B0,
+ shevahebrew: 0x05B0,
+ shevanarrowhebrew: 0x05B0,
+ shevaquarterhebrew: 0x05B0,
+ shevawidehebrew: 0x05B0,
+ shhacyrillic: 0x04BB,
+ shimacoptic: 0x03ED,
+ shin: 0x05E9,
+ shindagesh: 0xFB49,
+ shindageshhebrew: 0xFB49,
+ shindageshshindot: 0xFB2C,
+ shindageshshindothebrew: 0xFB2C,
+ shindageshsindot: 0xFB2D,
+ shindageshsindothebrew: 0xFB2D,
+ shindothebrew: 0x05C1,
+ shinhebrew: 0x05E9,
+ shinshindot: 0xFB2A,
+ shinshindothebrew: 0xFB2A,
+ shinsindot: 0xFB2B,
+ shinsindothebrew: 0xFB2B,
+ shook: 0x0282,
+ sigma: 0x03C3,
+ sigma1: 0x03C2,
+ sigmafinal: 0x03C2,
+ sigmalunatesymbolgreek: 0x03F2,
+ sihiragana: 0x3057,
+ sikatakana: 0x30B7,
+ sikatakanahalfwidth: 0xFF7C,
+ siluqhebrew: 0x05BD,
+ siluqlefthebrew: 0x05BD,
+ similar: 0x223C,
+ sindothebrew: 0x05C2,
+ siosacirclekorean: 0x3274,
+ siosaparenkorean: 0x3214,
+ sioscieuckorean: 0x317E,
+ sioscirclekorean: 0x3266,
+ sioskiyeokkorean: 0x317A,
+ sioskorean: 0x3145,
+ siosnieunkorean: 0x317B,
+ siosparenkorean: 0x3206,
+ siospieupkorean: 0x317D,
+ siostikeutkorean: 0x317C,
+ six: 0x0036,
+ sixarabic: 0x0666,
+ sixbengali: 0x09EC,
+ sixcircle: 0x2465,
+ sixcircleinversesansserif: 0x278F,
+ sixdeva: 0x096C,
+ sixgujarati: 0x0AEC,
+ sixgurmukhi: 0x0A6C,
+ sixhackarabic: 0x0666,
+ sixhangzhou: 0x3026,
+ sixideographicparen: 0x3225,
+ sixinferior: 0x2086,
+ sixmonospace: 0xFF16,
+ sixoldstyle: 0xF736,
+ sixparen: 0x2479,
+ sixperiod: 0x248D,
+ sixpersian: 0x06F6,
+ sixroman: 0x2175,
+ sixsuperior: 0x2076,
+ sixteencircle: 0x246F,
+ sixteencurrencydenominatorbengali: 0x09F9,
+ sixteenparen: 0x2483,
+ sixteenperiod: 0x2497,
+ sixthai: 0x0E56,
+ slash: 0x002F,
+ slashmonospace: 0xFF0F,
+ slong: 0x017F,
+ slongdotaccent: 0x1E9B,
+ smileface: 0x263A,
+ smonospace: 0xFF53,
+ sofpasuqhebrew: 0x05C3,
+ softhyphen: 0x00AD,
+ softsigncyrillic: 0x044C,
+ sohiragana: 0x305D,
+ sokatakana: 0x30BD,
+ sokatakanahalfwidth: 0xFF7F,
+ soliduslongoverlaycmb: 0x0338,
+ solidusshortoverlaycmb: 0x0337,
+ sorusithai: 0x0E29,
+ sosalathai: 0x0E28,
+ sosothai: 0x0E0B,
+ sosuathai: 0x0E2A,
+ space: 0x0020,
+ spacehackarabic: 0x0020,
+ spade: 0x2660,
+ spadesuitblack: 0x2660,
+ spadesuitwhite: 0x2664,
+ sparen: 0x24AE,
+ squarebelowcmb: 0x033B,
+ squarecc: 0x33C4,
+ squarecm: 0x339D,
+ squarediagonalcrosshatchfill: 0x25A9,
+ squarehorizontalfill: 0x25A4,
+ squarekg: 0x338F,
+ squarekm: 0x339E,
+ squarekmcapital: 0x33CE,
+ squareln: 0x33D1,
+ squarelog: 0x33D2,
+ squaremg: 0x338E,
+ squaremil: 0x33D5,
+ squaremm: 0x339C,
+ squaremsquared: 0x33A1,
+ squareorthogonalcrosshatchfill: 0x25A6,
+ squareupperlefttolowerrightfill: 0x25A7,
+ squareupperrighttolowerleftfill: 0x25A8,
+ squareverticalfill: 0x25A5,
+ squarewhitewithsmallblack: 0x25A3,
+ srsquare: 0x33DB,
+ ssabengali: 0x09B7,
+ ssadeva: 0x0937,
+ ssagujarati: 0x0AB7,
+ ssangcieuckorean: 0x3149,
+ ssanghieuhkorean: 0x3185,
+ ssangieungkorean: 0x3180,
+ ssangkiyeokkorean: 0x3132,
+ ssangnieunkorean: 0x3165,
+ ssangpieupkorean: 0x3143,
+ ssangsioskorean: 0x3146,
+ ssangtikeutkorean: 0x3138,
+ ssuperior: 0xF6F2,
+ sterling: 0x00A3,
+ sterlingmonospace: 0xFFE1,
+ strokelongoverlaycmb: 0x0336,
+ strokeshortoverlaycmb: 0x0335,
+ subset: 0x2282,
+ subsetnotequal: 0x228A,
+ subsetorequal: 0x2286,
+ succeeds: 0x227B,
+ suchthat: 0x220B,
+ suhiragana: 0x3059,
+ sukatakana: 0x30B9,
+ sukatakanahalfwidth: 0xFF7D,
+ sukunarabic: 0x0652,
+ summation: 0x2211,
+ sun: 0x263C,
+ superset: 0x2283,
+ supersetnotequal: 0x228B,
+ supersetorequal: 0x2287,
+ svsquare: 0x33DC,
+ syouwaerasquare: 0x337C,
+ t: 0x0074,
+ tabengali: 0x09A4,
+ tackdown: 0x22A4,
+ tackleft: 0x22A3,
+ tadeva: 0x0924,
+ tagujarati: 0x0AA4,
+ tagurmukhi: 0x0A24,
+ taharabic: 0x0637,
+ tahfinalarabic: 0xFEC2,
+ tahinitialarabic: 0xFEC3,
+ tahiragana: 0x305F,
+ tahmedialarabic: 0xFEC4,
+ taisyouerasquare: 0x337D,
+ takatakana: 0x30BF,
+ takatakanahalfwidth: 0xFF80,
+ tatweelarabic: 0x0640,
+ tau: 0x03C4,
+ tav: 0x05EA,
+ tavdages: 0xFB4A,
+ tavdagesh: 0xFB4A,
+ tavdageshhebrew: 0xFB4A,
+ tavhebrew: 0x05EA,
+ tbar: 0x0167,
+ tbopomofo: 0x310A,
+ tcaron: 0x0165,
+ tccurl: 0x02A8,
+ tcedilla: 0x0163,
+ tcheharabic: 0x0686,
+ tchehfinalarabic: 0xFB7B,
+ tchehinitialarabic: 0xFB7C,
+ tchehmedialarabic: 0xFB7D,
+ tchehmeeminitialarabic: 0xFB7CFEE4,
+ tcircle: 0x24E3,
+ tcircumflexbelow: 0x1E71,
+ tcommaaccent: 0x0163,
+ tdieresis: 0x1E97,
+ tdotaccent: 0x1E6B,
+ tdotbelow: 0x1E6D,
+ tecyrillic: 0x0442,
+ tedescendercyrillic: 0x04AD,
+ teharabic: 0x062A,
+ tehfinalarabic: 0xFE96,
+ tehhahinitialarabic: 0xFCA2,
+ tehhahisolatedarabic: 0xFC0C,
+ tehinitialarabic: 0xFE97,
+ tehiragana: 0x3066,
+ tehjeeminitialarabic: 0xFCA1,
+ tehjeemisolatedarabic: 0xFC0B,
+ tehmarbutaarabic: 0x0629,
+ tehmarbutafinalarabic: 0xFE94,
+ tehmedialarabic: 0xFE98,
+ tehmeeminitialarabic: 0xFCA4,
+ tehmeemisolatedarabic: 0xFC0E,
+ tehnoonfinalarabic: 0xFC73,
+ tekatakana: 0x30C6,
+ tekatakanahalfwidth: 0xFF83,
+ telephone: 0x2121,
+ telephoneblack: 0x260E,
+ telishagedolahebrew: 0x05A0,
+ telishaqetanahebrew: 0x05A9,
+ tencircle: 0x2469,
+ tenideographicparen: 0x3229,
+ tenparen: 0x247D,
+ tenperiod: 0x2491,
+ tenroman: 0x2179,
+ tesh: 0x02A7,
+ tet: 0x05D8,
+ tetdagesh: 0xFB38,
+ tetdageshhebrew: 0xFB38,
+ tethebrew: 0x05D8,
+ tetsecyrillic: 0x04B5,
+ tevirhebrew: 0x059B,
+ tevirlefthebrew: 0x059B,
+ thabengali: 0x09A5,
+ thadeva: 0x0925,
+ thagujarati: 0x0AA5,
+ thagurmukhi: 0x0A25,
+ thalarabic: 0x0630,
+ thalfinalarabic: 0xFEAC,
+ thanthakhatlowleftthai: 0xF898,
+ thanthakhatlowrightthai: 0xF897,
+ thanthakhatthai: 0x0E4C,
+ thanthakhatupperleftthai: 0xF896,
+ theharabic: 0x062B,
+ thehfinalarabic: 0xFE9A,
+ thehinitialarabic: 0xFE9B,
+ thehmedialarabic: 0xFE9C,
+ thereexists: 0x2203,
+ therefore: 0x2234,
+ theta: 0x03B8,
+ theta1: 0x03D1,
+ thetasymbolgreek: 0x03D1,
+ thieuthacirclekorean: 0x3279,
+ thieuthaparenkorean: 0x3219,
+ thieuthcirclekorean: 0x326B,
+ thieuthkorean: 0x314C,
+ thieuthparenkorean: 0x320B,
+ thirteencircle: 0x246C,
+ thirteenparen: 0x2480,
+ thirteenperiod: 0x2494,
+ thonangmonthothai: 0x0E11,
+ thook: 0x01AD,
+ thophuthaothai: 0x0E12,
+ thorn: 0x00FE,
+ thothahanthai: 0x0E17,
+ thothanthai: 0x0E10,
+ thothongthai: 0x0E18,
+ thothungthai: 0x0E16,
+ thousandcyrillic: 0x0482,
+ thousandsseparatorarabic: 0x066C,
+ thousandsseparatorpersian: 0x066C,
+ three: 0x0033,
+ threearabic: 0x0663,
+ threebengali: 0x09E9,
+ threecircle: 0x2462,
+ threecircleinversesansserif: 0x278C,
+ threedeva: 0x0969,
+ threeeighths: 0x215C,
+ threegujarati: 0x0AE9,
+ threegurmukhi: 0x0A69,
+ threehackarabic: 0x0663,
+ threehangzhou: 0x3023,
+ threeideographicparen: 0x3222,
+ threeinferior: 0x2083,
+ threemonospace: 0xFF13,
+ threenumeratorbengali: 0x09F6,
+ threeoldstyle: 0xF733,
+ threeparen: 0x2476,
+ threeperiod: 0x248A,
+ threepersian: 0x06F3,
+ threequarters: 0x00BE,
+ threequartersemdash: 0xF6DE,
+ threeroman: 0x2172,
+ threesuperior: 0x00B3,
+ threethai: 0x0E53,
+ thzsquare: 0x3394,
+ tihiragana: 0x3061,
+ tikatakana: 0x30C1,
+ tikatakanahalfwidth: 0xFF81,
+ tikeutacirclekorean: 0x3270,
+ tikeutaparenkorean: 0x3210,
+ tikeutcirclekorean: 0x3262,
+ tikeutkorean: 0x3137,
+ tikeutparenkorean: 0x3202,
+ tilde: 0x02DC,
+ tildebelowcmb: 0x0330,
+ tildecmb: 0x0303,
+ tildecomb: 0x0303,
+ tildedoublecmb: 0x0360,
+ tildeoperator: 0x223C,
+ tildeoverlaycmb: 0x0334,
+ tildeverticalcmb: 0x033E,
+ timescircle: 0x2297,
+ tipehahebrew: 0x0596,
+ tipehalefthebrew: 0x0596,
+ tippigurmukhi: 0x0A70,
+ titlocyrilliccmb: 0x0483,
+ tiwnarmenian: 0x057F,
+ tlinebelow: 0x1E6F,
+ tmonospace: 0xFF54,
+ toarmenian: 0x0569,
+ tohiragana: 0x3068,
+ tokatakana: 0x30C8,
+ tokatakanahalfwidth: 0xFF84,
+ tonebarextrahighmod: 0x02E5,
+ tonebarextralowmod: 0x02E9,
+ tonebarhighmod: 0x02E6,
+ tonebarlowmod: 0x02E8,
+ tonebarmidmod: 0x02E7,
+ tonefive: 0x01BD,
+ tonesix: 0x0185,
+ tonetwo: 0x01A8,
+ tonos: 0x0384,
+ tonsquare: 0x3327,
+ topatakthai: 0x0E0F,
+ tortoiseshellbracketleft: 0x3014,
+ tortoiseshellbracketleftsmall: 0xFE5D,
+ tortoiseshellbracketleftvertical: 0xFE39,
+ tortoiseshellbracketright: 0x3015,
+ tortoiseshellbracketrightsmall: 0xFE5E,
+ tortoiseshellbracketrightvertical: 0xFE3A,
+ totaothai: 0x0E15,
+ tpalatalhook: 0x01AB,
+ tparen: 0x24AF,
+ trademark: 0x2122,
+ trademarksans: 0xF8EA,
+ trademarkserif: 0xF6DB,
+ tretroflexhook: 0x0288,
+ triagdn: 0x25BC,
+ triaglf: 0x25C4,
+ triagrt: 0x25BA,
+ triagup: 0x25B2,
+ ts: 0x02A6,
+ tsadi: 0x05E6,
+ tsadidagesh: 0xFB46,
+ tsadidageshhebrew: 0xFB46,
+ tsadihebrew: 0x05E6,
+ tsecyrillic: 0x0446,
+ tsere: 0x05B5,
+ tsere12: 0x05B5,
+ tsere1e: 0x05B5,
+ tsere2b: 0x05B5,
+ tserehebrew: 0x05B5,
+ tserenarrowhebrew: 0x05B5,
+ tserequarterhebrew: 0x05B5,
+ tserewidehebrew: 0x05B5,
+ tshecyrillic: 0x045B,
+ tsuperior: 0xF6F3,
+ ttabengali: 0x099F,
+ ttadeva: 0x091F,
+ ttagujarati: 0x0A9F,
+ ttagurmukhi: 0x0A1F,
+ tteharabic: 0x0679,
+ ttehfinalarabic: 0xFB67,
+ ttehinitialarabic: 0xFB68,
+ ttehmedialarabic: 0xFB69,
+ tthabengali: 0x09A0,
+ tthadeva: 0x0920,
+ tthagujarati: 0x0AA0,
+ tthagurmukhi: 0x0A20,
+ tturned: 0x0287,
+ tuhiragana: 0x3064,
+ tukatakana: 0x30C4,
+ tukatakanahalfwidth: 0xFF82,
+ tusmallhiragana: 0x3063,
+ tusmallkatakana: 0x30C3,
+ tusmallkatakanahalfwidth: 0xFF6F,
+ twelvecircle: 0x246B,
+ twelveparen: 0x247F,
+ twelveperiod: 0x2493,
+ twelveroman: 0x217B,
+ twentycircle: 0x2473,
+ twentyhangzhou: 0x5344,
+ twentyparen: 0x2487,
+ twentyperiod: 0x249B,
+ two: 0x0032,
+ twoarabic: 0x0662,
+ twobengali: 0x09E8,
+ twocircle: 0x2461,
+ twocircleinversesansserif: 0x278B,
+ twodeva: 0x0968,
+ twodotenleader: 0x2025,
+ twodotleader: 0x2025,
+ twodotleadervertical: 0xFE30,
+ twogujarati: 0x0AE8,
+ twogurmukhi: 0x0A68,
+ twohackarabic: 0x0662,
+ twohangzhou: 0x3022,
+ twoideographicparen: 0x3221,
+ twoinferior: 0x2082,
+ twomonospace: 0xFF12,
+ twonumeratorbengali: 0x09F5,
+ twooldstyle: 0xF732,
+ twoparen: 0x2475,
+ twoperiod: 0x2489,
+ twopersian: 0x06F2,
+ tworoman: 0x2171,
+ twostroke: 0x01BB,
+ twosuperior: 0x00B2,
+ twothai: 0x0E52,
+ twothirds: 0x2154,
+ u: 0x0075,
+ uacute: 0x00FA,
+ ubar: 0x0289,
+ ubengali: 0x0989,
+ ubopomofo: 0x3128,
+ ubreve: 0x016D,
+ ucaron: 0x01D4,
+ ucircle: 0x24E4,
+ ucircumflex: 0x00FB,
+ ucircumflexbelow: 0x1E77,
+ ucyrillic: 0x0443,
+ udattadeva: 0x0951,
+ udblacute: 0x0171,
+ udblgrave: 0x0215,
+ udeva: 0x0909,
+ udieresis: 0x00FC,
+ udieresisacute: 0x01D8,
+ udieresisbelow: 0x1E73,
+ udieresiscaron: 0x01DA,
+ udieresiscyrillic: 0x04F1,
+ udieresisgrave: 0x01DC,
+ udieresismacron: 0x01D6,
+ udotbelow: 0x1EE5,
+ ugrave: 0x00F9,
+ ugujarati: 0x0A89,
+ ugurmukhi: 0x0A09,
+ uhiragana: 0x3046,
+ uhookabove: 0x1EE7,
+ uhorn: 0x01B0,
+ uhornacute: 0x1EE9,
+ uhorndotbelow: 0x1EF1,
+ uhorngrave: 0x1EEB,
+ uhornhookabove: 0x1EED,
+ uhorntilde: 0x1EEF,
+ uhungarumlaut: 0x0171,
+ uhungarumlautcyrillic: 0x04F3,
+ uinvertedbreve: 0x0217,
+ ukatakana: 0x30A6,
+ ukatakanahalfwidth: 0xFF73,
+ ukcyrillic: 0x0479,
+ ukorean: 0x315C,
+ umacron: 0x016B,
+ umacroncyrillic: 0x04EF,
+ umacrondieresis: 0x1E7B,
+ umatragurmukhi: 0x0A41,
+ umonospace: 0xFF55,
+ underscore: 0x005F,
+ underscoredbl: 0x2017,
+ underscoremonospace: 0xFF3F,
+ underscorevertical: 0xFE33,
+ underscorewavy: 0xFE4F,
+ union: 0x222A,
+ universal: 0x2200,
+ uogonek: 0x0173,
+ uparen: 0x24B0,
+ upblock: 0x2580,
+ upperdothebrew: 0x05C4,
+ upsilon: 0x03C5,
+ upsilondieresis: 0x03CB,
+ upsilondieresistonos: 0x03B0,
+ upsilonlatin: 0x028A,
+ upsilontonos: 0x03CD,
+ uptackbelowcmb: 0x031D,
+ uptackmod: 0x02D4,
+ uragurmukhi: 0x0A73,
+ uring: 0x016F,
+ ushortcyrillic: 0x045E,
+ usmallhiragana: 0x3045,
+ usmallkatakana: 0x30A5,
+ usmallkatakanahalfwidth: 0xFF69,
+ ustraightcyrillic: 0x04AF,
+ ustraightstrokecyrillic: 0x04B1,
+ utilde: 0x0169,
+ utildeacute: 0x1E79,
+ utildebelow: 0x1E75,
+ uubengali: 0x098A,
+ uudeva: 0x090A,
+ uugujarati: 0x0A8A,
+ uugurmukhi: 0x0A0A,
+ uumatragurmukhi: 0x0A42,
+ uuvowelsignbengali: 0x09C2,
+ uuvowelsigndeva: 0x0942,
+ uuvowelsigngujarati: 0x0AC2,
+ uvowelsignbengali: 0x09C1,
+ uvowelsigndeva: 0x0941,
+ uvowelsigngujarati: 0x0AC1,
+ v: 0x0076,
+ vadeva: 0x0935,
+ vagujarati: 0x0AB5,
+ vagurmukhi: 0x0A35,
+ vakatakana: 0x30F7,
+ vav: 0x05D5,
+ vavdagesh: 0xFB35,
+ vavdagesh65: 0xFB35,
+ vavdageshhebrew: 0xFB35,
+ vavhebrew: 0x05D5,
+ vavholam: 0xFB4B,
+ vavholamhebrew: 0xFB4B,
+ vavvavhebrew: 0x05F0,
+ vavyodhebrew: 0x05F1,
+ vcircle: 0x24E5,
+ vdotbelow: 0x1E7F,
+ vecyrillic: 0x0432,
+ veharabic: 0x06A4,
+ vehfinalarabic: 0xFB6B,
+ vehinitialarabic: 0xFB6C,
+ vehmedialarabic: 0xFB6D,
+ vekatakana: 0x30F9,
+ venus: 0x2640,
+ verticalbar: 0x007C,
+ verticallineabovecmb: 0x030D,
+ verticallinebelowcmb: 0x0329,
+ verticallinelowmod: 0x02CC,
+ verticallinemod: 0x02C8,
+ vewarmenian: 0x057E,
+ vhook: 0x028B,
+ vikatakana: 0x30F8,
+ viramabengali: 0x09CD,
+ viramadeva: 0x094D,
+ viramagujarati: 0x0ACD,
+ visargabengali: 0x0983,
+ visargadeva: 0x0903,
+ visargagujarati: 0x0A83,
+ vmonospace: 0xFF56,
+ voarmenian: 0x0578,
+ voicediterationhiragana: 0x309E,
+ voicediterationkatakana: 0x30FE,
+ voicedmarkkana: 0x309B,
+ voicedmarkkanahalfwidth: 0xFF9E,
+ vokatakana: 0x30FA,
+ vparen: 0x24B1,
+ vtilde: 0x1E7D,
+ vturned: 0x028C,
+ vuhiragana: 0x3094,
+ vukatakana: 0x30F4,
+ w: 0x0077,
+ wacute: 0x1E83,
+ waekorean: 0x3159,
+ wahiragana: 0x308F,
+ wakatakana: 0x30EF,
+ wakatakanahalfwidth: 0xFF9C,
+ wakorean: 0x3158,
+ wasmallhiragana: 0x308E,
+ wasmallkatakana: 0x30EE,
+ wattosquare: 0x3357,
+ wavedash: 0x301C,
+ wavyunderscorevertical: 0xFE34,
+ wawarabic: 0x0648,
+ wawfinalarabic: 0xFEEE,
+ wawhamzaabovearabic: 0x0624,
+ wawhamzaabovefinalarabic: 0xFE86,
+ wbsquare: 0x33DD,
+ wcircle: 0x24E6,
+ wcircumflex: 0x0175,
+ wdieresis: 0x1E85,
+ wdotaccent: 0x1E87,
+ wdotbelow: 0x1E89,
+ wehiragana: 0x3091,
+ weierstrass: 0x2118,
+ wekatakana: 0x30F1,
+ wekorean: 0x315E,
+ weokorean: 0x315D,
+ wgrave: 0x1E81,
+ whitebullet: 0x25E6,
+ whitecircle: 0x25CB,
+ whitecircleinverse: 0x25D9,
+ whitecornerbracketleft: 0x300E,
+ whitecornerbracketleftvertical: 0xFE43,
+ whitecornerbracketright: 0x300F,
+ whitecornerbracketrightvertical: 0xFE44,
+ whitediamond: 0x25C7,
+ whitediamondcontainingblacksmalldiamond: 0x25C8,
+ whitedownpointingsmalltriangle: 0x25BF,
+ whitedownpointingtriangle: 0x25BD,
+ whiteleftpointingsmalltriangle: 0x25C3,
+ whiteleftpointingtriangle: 0x25C1,
+ whitelenticularbracketleft: 0x3016,
+ whitelenticularbracketright: 0x3017,
+ whiterightpointingsmalltriangle: 0x25B9,
+ whiterightpointingtriangle: 0x25B7,
+ whitesmallsquare: 0x25AB,
+ whitesmilingface: 0x263A,
+ whitesquare: 0x25A1,
+ whitestar: 0x2606,
+ whitetelephone: 0x260F,
+ whitetortoiseshellbracketleft: 0x3018,
+ whitetortoiseshellbracketright: 0x3019,
+ whiteuppointingsmalltriangle: 0x25B5,
+ whiteuppointingtriangle: 0x25B3,
+ wihiragana: 0x3090,
+ wikatakana: 0x30F0,
+ wikorean: 0x315F,
+ wmonospace: 0xFF57,
+ wohiragana: 0x3092,
+ wokatakana: 0x30F2,
+ wokatakanahalfwidth: 0xFF66,
+ won: 0x20A9,
+ wonmonospace: 0xFFE6,
+ wowaenthai: 0x0E27,
+ wparen: 0x24B2,
+ wring: 0x1E98,
+ wsuperior: 0x02B7,
+ wturned: 0x028D,
+ wynn: 0x01BF,
+ x: 0x0078,
+ xabovecmb: 0x033D,
+ xbopomofo: 0x3112,
+ xcircle: 0x24E7,
+ xdieresis: 0x1E8D,
+ xdotaccent: 0x1E8B,
+ xeharmenian: 0x056D,
+ xi: 0x03BE,
+ xmonospace: 0xFF58,
+ xparen: 0x24B3,
+ xsuperior: 0x02E3,
+ y: 0x0079,
+ yaadosquare: 0x334E,
+ yabengali: 0x09AF,
+ yacute: 0x00FD,
+ yadeva: 0x092F,
+ yaekorean: 0x3152,
+ yagujarati: 0x0AAF,
+ yagurmukhi: 0x0A2F,
+ yahiragana: 0x3084,
+ yakatakana: 0x30E4,
+ yakatakanahalfwidth: 0xFF94,
+ yakorean: 0x3151,
+ yamakkanthai: 0x0E4E,
+ yasmallhiragana: 0x3083,
+ yasmallkatakana: 0x30E3,
+ yasmallkatakanahalfwidth: 0xFF6C,
+ yatcyrillic: 0x0463,
+ ycircle: 0x24E8,
+ ycircumflex: 0x0177,
+ ydieresis: 0x00FF,
+ ydotaccent: 0x1E8F,
+ ydotbelow: 0x1EF5,
+ yeharabic: 0x064A,
+ yehbarreearabic: 0x06D2,
+ yehbarreefinalarabic: 0xFBAF,
+ yehfinalarabic: 0xFEF2,
+ yehhamzaabovearabic: 0x0626,
+ yehhamzaabovefinalarabic: 0xFE8A,
+ yehhamzaaboveinitialarabic: 0xFE8B,
+ yehhamzaabovemedialarabic: 0xFE8C,
+ yehinitialarabic: 0xFEF3,
+ yehmedialarabic: 0xFEF4,
+ yehmeeminitialarabic: 0xFCDD,
+ yehmeemisolatedarabic: 0xFC58,
+ yehnoonfinalarabic: 0xFC94,
+ yehthreedotsbelowarabic: 0x06D1,
+ yekorean: 0x3156,
+ yen: 0x00A5,
+ yenmonospace: 0xFFE5,
+ yeokorean: 0x3155,
+ yeorinhieuhkorean: 0x3186,
+ yerahbenyomohebrew: 0x05AA,
+ yerahbenyomolefthebrew: 0x05AA,
+ yericyrillic: 0x044B,
+ yerudieresiscyrillic: 0x04F9,
+ yesieungkorean: 0x3181,
+ yesieungpansioskorean: 0x3183,
+ yesieungsioskorean: 0x3182,
+ yetivhebrew: 0x059A,
+ ygrave: 0x1EF3,
+ yhook: 0x01B4,
+ yhookabove: 0x1EF7,
+ yiarmenian: 0x0575,
+ yicyrillic: 0x0457,
+ yikorean: 0x3162,
+ yinyang: 0x262F,
+ yiwnarmenian: 0x0582,
+ ymonospace: 0xFF59,
+ yod: 0x05D9,
+ yoddagesh: 0xFB39,
+ yoddageshhebrew: 0xFB39,
+ yodhebrew: 0x05D9,
+ yodyodhebrew: 0x05F2,
+ yodyodpatahhebrew: 0xFB1F,
+ yohiragana: 0x3088,
+ yoikorean: 0x3189,
+ yokatakana: 0x30E8,
+ yokatakanahalfwidth: 0xFF96,
+ yokorean: 0x315B,
+ yosmallhiragana: 0x3087,
+ yosmallkatakana: 0x30E7,
+ yosmallkatakanahalfwidth: 0xFF6E,
+ yotgreek: 0x03F3,
+ yoyaekorean: 0x3188,
+ yoyakorean: 0x3187,
+ yoyakthai: 0x0E22,
+ yoyingthai: 0x0E0D,
+ yparen: 0x24B4,
+ ypogegrammeni: 0x037A,
+ ypogegrammenigreekcmb: 0x0345,
+ yr: 0x01A6,
+ yring: 0x1E99,
+ ysuperior: 0x02B8,
+ ytilde: 0x1EF9,
+ yturned: 0x028E,
+ yuhiragana: 0x3086,
+ yuikorean: 0x318C,
+ yukatakana: 0x30E6,
+ yukatakanahalfwidth: 0xFF95,
+ yukorean: 0x3160,
+ yusbigcyrillic: 0x046B,
+ yusbigiotifiedcyrillic: 0x046D,
+ yuslittlecyrillic: 0x0467,
+ yuslittleiotifiedcyrillic: 0x0469,
+ yusmallhiragana: 0x3085,
+ yusmallkatakana: 0x30E5,
+ yusmallkatakanahalfwidth: 0xFF6D,
+ yuyekorean: 0x318B,
+ yuyeokorean: 0x318A,
+ yyabengali: 0x09DF,
+ yyadeva: 0x095F,
+ z: 0x007A,
+ zaarmenian: 0x0566,
+ zacute: 0x017A,
+ zadeva: 0x095B,
+ zagurmukhi: 0x0A5B,
+ zaharabic: 0x0638,
+ zahfinalarabic: 0xFEC6,
+ zahinitialarabic: 0xFEC7,
+ zahiragana: 0x3056,
+ zahmedialarabic: 0xFEC8,
+ zainarabic: 0x0632,
+ zainfinalarabic: 0xFEB0,
+ zakatakana: 0x30B6,
+ zaqefgadolhebrew: 0x0595,
+ zaqefqatanhebrew: 0x0594,
+ zarqahebrew: 0x0598,
+ zayin: 0x05D6,
+ zayindagesh: 0xFB36,
+ zayindageshhebrew: 0xFB36,
+ zayinhebrew: 0x05D6,
+ zbopomofo: 0x3117,
+ zcaron: 0x017E,
+ zcircle: 0x24E9,
+ zcircumflex: 0x1E91,
+ zcurl: 0x0291,
+ zdot: 0x017C,
+ zdotaccent: 0x017C,
+ zdotbelow: 0x1E93,
+ zecyrillic: 0x0437,
+ zedescendercyrillic: 0x0499,
+ zedieresiscyrillic: 0x04DF,
+ zehiragana: 0x305C,
+ zekatakana: 0x30BC,
+ zero: 0x0030,
+ zeroarabic: 0x0660,
+ zerobengali: 0x09E6,
+ zerodeva: 0x0966,
+ zerogujarati: 0x0AE6,
+ zerogurmukhi: 0x0A66,
+ zerohackarabic: 0x0660,
+ zeroinferior: 0x2080,
+ zeromonospace: 0xFF10,
+ zerooldstyle: 0xF730,
+ zeropersian: 0x06F0,
+ zerosuperior: 0x2070,
+ zerothai: 0x0E50,
+ zerowidthjoiner: 0xFEFF,
+ zerowidthnonjoiner: 0x200C,
+ zerowidthspace: 0x200B,
+ zeta: 0x03B6,
+ zhbopomofo: 0x3113,
+ zhearmenian: 0x056A,
+ zhebrevecyrillic: 0x04C2,
+ zhecyrillic: 0x0436,
+ zhedescendercyrillic: 0x0497,
+ zhedieresiscyrillic: 0x04DD,
+ zihiragana: 0x3058,
+ zikatakana: 0x30B8,
+ zinorhebrew: 0x05AE,
+ zlinebelow: 0x1E95,
+ zmonospace: 0xFF5A,
+ zohiragana: 0x305E,
+ zokatakana: 0x30BE,
+ zparen: 0x24B5,
+ zretroflexhook: 0x0290,
+ zstroke: 0x01B6,
+ zuhiragana: 0x305A,
+ zukatakana: 0x30BA
+};
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFImage = (function pdfImage() {
+ function constructor(xref, res, image, inline) {
+ this.image = image;
+ if (image.getParams) {
+ // JPX/JPEG2000 streams directly contain bits per component
+ // and color space mode information.
+ TODO('get params from actual stream');
+ // var bits = ...
+ // var colorspace = ...
+ }
+ // TODO cache rendered images?
+
+ var dict = image.dict;
+ this.width = dict.get('Width', 'W');
+ this.height = dict.get('Height', 'H');
+
+ if (this.width < 1 || this.height < 1)
+ error('Invalid image width: ' + this.width + ' or height: ' +
+ this.height);
+
+ this.interpolate = dict.get('Interpolate', 'I') || false;
+ this.imageMask = dict.get('ImageMask', 'IM') || false;
+
+ var bitsPerComponent = image.bitsPerComponent;
+ if (!bitsPerComponent) {
+ bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+ if (!bitsPerComponent) {
+ if (this.imageMask)
+ bitsPerComponent = 1;
+ else
+ error('Bits per component missing in image: ' + this.imageMask);
+ }
+ }
+ this.bpc = bitsPerComponent;
+
+ if (!this.imageMask) {
+ var colorSpace = dict.get('ColorSpace', 'CS');
+ if (!colorSpace) {
+ TODO('JPX images (which don"t require color spaces');
+ colorSpace = new Name('DeviceRGB');
+ }
+ this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
+ this.numComps = this.colorSpace.numComps;
+ }
+
+ this.decode = dict.get('Decode', 'D');
+
+ var mask = xref.fetchIfRef(dict.get('Mask'));
+ var smask = xref.fetchIfRef(dict.get('SMask'));
+
+ if (mask) {
+ TODO('masked images');
+ } else if (smask) {
+ this.smask = new PDFImage(xref, res, smask);
+ }
+ }
+
+ constructor.prototype = {
+ getComponents: function getComponents(buffer, decodeMap) {
+ var bpc = this.bpc;
+ if (bpc == 8)
+ return buffer;
+
+ var width = this.width;
+ var height = this.height;
+ var numComps = this.numComps;
+
+ var length = width * height;
+ var bufferPos = 0;
+ var output = bpc <= 8 ? new Uint8Array(length) :
+ bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+ var rowComps = width * numComps;
+
+ if (bpc == 1) {
+ var valueZero = 0, valueOne = 1;
+ if (decodeMap) {
+ valueZero = decodeMap[0] ? 1 : 0;
+ valueOne = decodeMap[1] ? 1 : 0;
+ }
+ var mask = 0;
+ var buf = 0;
+
+ for (var i = 0, ii = length; i < ii; ++i) {
+ if (i % rowComps == 0) {
+ mask = 0;
+ buf = 0;
+ } else {
+ mask >>= 1;
+ }
+
+ if (mask <= 0) {
+ buf = buffer[bufferPos++];
+ mask = 128;
+ }
+
+ output[i] = !(buf & mask) ? valueZero : valueOne;
+ }
+ } else {
+ if (decodeMap != null)
+ TODO('interpolate component values');
+ var bits = 0, buf = 0;
+ for (var i = 0, ii = length; i < ii; ++i) {
+ if (i % rowComps == 0) {
+ buf = 0;
+ bits = 0;
+ }
+
+ while (bits < bpc) {
+ buf = (buf << 8) | buffer[bufferPos++];
+ bits += 8;
+ }
+
+ var remainingBits = bits - bpc;
+ output[i] = buf >> remainingBits;
+ buf = buf & ((1 << remainingBits) - 1);
+ bits = remainingBits;
+ }
+ }
+ return output;
+ },
+ getOpacity: function getOpacity() {
+ var smask = this.smask;
+ var width = this.width;
+ var height = this.height;
+ var buf = new Uint8Array(width * height);
+
+ if (smask) {
+ if (smask.image.getImage) {
+ // smask is a DOM image
+ var tempCanvas = new ScratchCanvas(width, height);
+ var tempCtx = tempCanvas.getContext('2d');
+ var domImage = smask.image.getImage();
+ tempCtx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, 0, width, height);
+ var data = tempCtx.getImageData(0, 0, width, height).data;
+ for (var i = 0, j = 0, ii = width * height; i < ii; ++i, j += 4)
+ buf[i] = data[j]; // getting first component value
+ return buf;
+ }
+ var sw = smask.width;
+ var sh = smask.height;
+ if (sw != this.width || sh != this.height)
+ error('smask dimensions do not match image dimensions: ' + sw +
+ ' != ' + this.width + ', ' + sh + ' != ' + this.height);
+
+ smask.fillGrayBuffer(buf);
+ return buf;
+ } else {
+ for (var i = 0, ii = width * height; i < ii; ++i)
+ buf[i] = 255;
+ }
+ return buf;
+ },
+ applyStencilMask: function applyStencilMask(buffer, inverseDecode) {
+ var width = this.width, height = this.height;
+ var bitStrideLength = (width + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(bitStrideLength * height);
+ var imgArrayPos = 0;
+ var i, j, mask, buf;
+ // removing making non-masked pixels transparent
+ var bufferPos = 3; // alpha component offset
+ for (i = 0; i < height; i++) {
+ mask = 0;
+ for (j = 0; j < width; j++) {
+ if (!mask) {
+ buf = imgArray[imgArrayPos++];
+ mask = 128;
+ }
+ if (!(buf & mask) == inverseDecode) {
+ buffer[bufferPos] = 0;
+ }
+ bufferPos += 4;
+ mask >>= 1;
+ }
+ }
+ },
+ fillRgbaBuffer: function fillRgbaBuffer(buffer, decodeMap) {
+ var numComps = this.numComps;
+ var width = this.width;
+ var height = this.height;
+ var bpc = this.bpc;
+
+ // rows start at byte boundary;
+ var rowBytes = (width * numComps * bpc + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(height * rowBytes);
+
+ var comps = this.colorSpace.getRgbBuffer(
+ this.getComponents(imgArray, decodeMap), bpc);
+ var compsPos = 0;
+ var opacity = this.getOpacity();
+ var opacityPos = 0;
+ var length = width * height * 4;
+
+ for (var i = 0; i < length; i += 4) {
+ buffer[i] = comps[compsPos++];
+ buffer[i + 1] = comps[compsPos++];
+ buffer[i + 2] = comps[compsPos++];
+ buffer[i + 3] = opacity[opacityPos++];
+ }
+ },
+ fillGrayBuffer: function fillGrayBuffer(buffer) {
+ var numComps = this.numComps;
+ if (numComps != 1)
+ error('Reading gray scale from a color image: ' + numComps);
+
+ var width = this.width;
+ var height = this.height;
+ var bpc = this.bpc;
+
+ // rows start at byte boundary;
+ var rowBytes = (width * numComps * bpc + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(height * rowBytes);
+
+ var comps = this.getComponents(imgArray);
+ var length = width * height;
+
+ for (var i = 0; i < length; ++i)
+ buffer[i] = comps[i];
+ }
+ };
+ return constructor;
+})();
+
+var JpegImageLoader = (function jpegImage() {
+ function JpegImageLoader(objId, imageData, objs) {
+ var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
+
+ var img = new Image();
+ img.onload = (function jpegImageLoaderOnload() {
+ this.loaded = true;
+
+ objs.resolve(objId, this);
+
+ if (this.onLoad)
+ this.onLoad();
+ }).bind(this);
+ img.src = src;
+ this.domImage = img;
+ }
+
+ JpegImageLoader.prototype = {
+ getImage: function jpegImageLoaderGetImage() {
+ return this.domImage;
+ }
+ };
+
+ return JpegImageLoader;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Metrics = {
+ 'Courier': 600,
+ 'Courier-Bold': 600,
+ 'Courier-BoldOblique': 600,
+ 'Courier-Oblique': 600,
+ 'Helvetica' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Bold': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-BoldOblique': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Oblique' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Symbol': {
+ 'space': 250,
+ 'exclam': 333,
+ 'universal': 713,
+ 'numbersign': 500,
+ 'existential': 549,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'suchthat': 439,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asteriskmath': 500,
+ 'plus': 549,
+ 'comma': 250,
+ 'minus': 549,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 549,
+ 'equal': 549,
+ 'greater': 549,
+ 'question': 444,
+ 'congruent': 549,
+ 'Alpha': 722,
+ 'Beta': 667,
+ 'Chi': 722,
+ 'Delta': 612,
+ 'Epsilon': 611,
+ 'Phi': 763,
+ 'Gamma': 603,
+ 'Eta': 722,
+ 'Iota': 333,
+ 'theta1': 631,
+ 'Kappa': 722,
+ 'Lambda': 686,
+ 'Mu': 889,
+ 'Nu': 722,
+ 'Omicron': 722,
+ 'Pi': 768,
+ 'Theta': 741,
+ 'Rho': 556,
+ 'Sigma': 592,
+ 'Tau': 611,
+ 'Upsilon': 690,
+ 'sigma1': 439,
+ 'Omega': 768,
+ 'Xi': 645,
+ 'Psi': 795,
+ 'Zeta': 611,
+ 'bracketleft': 333,
+ 'therefore': 863,
+ 'bracketright': 333,
+ 'perpendicular': 658,
+ 'underscore': 500,
+ 'radicalex': 500,
+ 'alpha': 631,
+ 'beta': 549,
+ 'chi': 549,
+ 'delta': 494,
+ 'epsilon': 439,
+ 'phi': 521,
+ 'gamma': 411,
+ 'eta': 603,
+ 'iota': 329,
+ 'phi1': 603,
+ 'kappa': 549,
+ 'lambda': 549,
+ 'mu': 576,
+ 'nu': 521,
+ 'omicron': 549,
+ 'pi': 549,
+ 'theta': 521,
+ 'rho': 549,
+ 'sigma': 603,
+ 'tau': 439,
+ 'upsilon': 576,
+ 'omega1': 713,
+ 'omega': 686,
+ 'xi': 493,
+ 'psi': 686,
+ 'zeta': 494,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'similar': 549,
+ 'Euro': 750,
+ 'Upsilon1': 620,
+ 'minute': 247,
+ 'lessequal': 549,
+ 'fraction': 167,
+ 'infinity': 713,
+ 'florin': 500,
+ 'club': 753,
+ 'diamond': 753,
+ 'heart': 753,
+ 'spade': 753,
+ 'arrowboth': 1042,
+ 'arrowleft': 987,
+ 'arrowup': 603,
+ 'arrowright': 987,
+ 'arrowdown': 603,
+ 'degree': 400,
+ 'plusminus': 549,
+ 'second': 411,
+ 'greaterequal': 549,
+ 'multiply': 549,
+ 'proportional': 713,
+ 'partialdiff': 494,
+ 'bullet': 460,
+ 'divide': 549,
+ 'notequal': 549,
+ 'equivalence': 549,
+ 'approxequal': 549,
+ 'ellipsis': 1000,
+ 'arrowvertex': 603,
+ 'arrowhorizex': 1000,
+ 'carriagereturn': 658,
+ 'aleph': 823,
+ 'Ifraktur': 686,
+ 'Rfraktur': 795,
+ 'weierstrass': 987,
+ 'circlemultiply': 768,
+ 'circleplus': 768,
+ 'emptyset': 823,
+ 'intersection': 768,
+ 'union': 768,
+ 'propersuperset': 713,
+ 'reflexsuperset': 713,
+ 'notsubset': 713,
+ 'propersubset': 713,
+ 'reflexsubset': 713,
+ 'element': 713,
+ 'notelement': 713,
+ 'angle': 768,
+ 'gradient': 713,
+ 'registerserif': 790,
+ 'copyrightserif': 790,
+ 'trademarkserif': 890,
+ 'product': 823,
+ 'radical': 549,
+ 'dotmath': 250,
+ 'logicalnot': 713,
+ 'logicaland': 603,
+ 'logicalor': 603,
+ 'arrowdblboth': 1042,
+ 'arrowdblleft': 987,
+ 'arrowdblup': 603,
+ 'arrowdblright': 987,
+ 'arrowdbldown': 603,
+ 'lozenge': 494,
+ 'angleleft': 329,
+ 'registersans': 790,
+ 'copyrightsans': 790,
+ 'trademarksans': 786,
+ 'summation': 713,
+ 'parenlefttp': 384,
+ 'parenleftex': 384,
+ 'parenleftbt': 384,
+ 'bracketlefttp': 384,
+ 'bracketleftex': 384,
+ 'bracketleftbt': 384,
+ 'bracelefttp': 494,
+ 'braceleftmid': 494,
+ 'braceleftbt': 494,
+ 'braceex': 494,
+ 'angleright': 329,
+ 'integral': 274,
+ 'integraltp': 686,
+ 'integralex': 686,
+ 'integralbt': 686,
+ 'parenrighttp': 384,
+ 'parenrightex': 384,
+ 'parenrightbt': 384,
+ 'bracketrighttp': 384,
+ 'bracketrightex': 384,
+ 'bracketrightbt': 384,
+ 'bracerighttp': 494,
+ 'bracerightmid': 494,
+ 'bracerightbt': 494,
+ 'apple': 790
+ },
+ 'Times-Roman': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 408,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 564,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 564,
+ 'equal': 564,
+ 'greater': 564,
+ 'question': 444,
+ 'at': 921,
+ 'A': 722,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 556,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 389,
+ 'K': 722,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 556,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 722,
+ 'W': 944,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 469,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 444,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 333,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'asciitilde': 541,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 180,
+ 'quotedblleft': 444,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 453,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 444,
+ 'quotedblright': 444,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 444,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 889,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 444,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 564,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 444,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 444,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 444,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 444,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 444,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 444,
+ 'Amacron': 722,
+ 'rcaron': 333,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 556,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 588,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 564,
+ 'uacute': 500,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 444,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 722,
+ 'Iacute': 333,
+ 'plusminus': 564,
+ 'brokenbar': 200,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 333,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 326,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 444,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 344,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 722,
+ 'zdotaccent': 444,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 500,
+ 'minus': 564,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 564,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Bold': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 1000,
+ 'ampersand': 833,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 930,
+ 'A': 722,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 778,
+ 'L': 667,
+ 'M': 944,
+ 'N': 722,
+ 'O': 778,
+ 'P': 611,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 556,
+ 'T': 667,
+ 'U': 722,
+ 'V': 722,
+ 'W': 1000,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 667,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 581,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 556,
+ 'c': 444,
+ 'd': 556,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 333,
+ 'k': 556,
+ 'l': 278,
+ 'm': 833,
+ 'n': 556,
+ 'o': 500,
+ 'p': 556,
+ 'q': 556,
+ 'r': 444,
+ 's': 389,
+ 't': 333,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 394,
+ 'bar': 220,
+ 'braceright': 394,
+ 'asciitilde': 520,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 540,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 300,
+ 'Lslash': 667,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 330,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 556,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 570,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 667,
+ 'Cacute': 722,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 722,
+ 'rcaron': 444,
+ 'ccedilla': 444,
+ 'Zdotaccent': 667,
+ 'Thorn': 611,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 556,
+ 'dcaron': 672,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 667,
+ 'partialdiff': 494,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 778,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 444,
+ 'omacron': 500,
+ 'Zacute': 667,
+ 'Zcaron': 667,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 416,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 300,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 394,
+ 'Kcommaaccent': 778,
+ 'Lacute': 667,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 667,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 444,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 667,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 444,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 556,
+ 'minus': 570,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 333,
+ 'logicalnot': 570,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-BoldItalic': {
+ 'space': 250,
+ 'exclam': 389,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 832,
+ 'A': 667,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 667,
+ 'F': 667,
+ 'G': 722,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 667,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 889,
+ 'X': 667,
+ 'Y': 611,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 570,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 556,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 556,
+ 'v': 444,
+ 'w': 667,
+ 'x': 500,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 348,
+ 'bar': 220,
+ 'braceright': 348,
+ 'asciitilde': 570,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 500,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 944,
+ 'ordfeminine': 266,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 300,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 611,
+ 'divide': 570,
+ 'Yacute': 611,
+ 'Acircumflex': 667,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 667,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 608,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 444,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 722,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 366,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 576,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 382,
+ 'Kcommaaccent': 667,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 500,
+ 'minus': 606,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 606,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Italic': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 420,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 675,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 675,
+ 'equal': 675,
+ 'greater': 675,
+ 'question': 500,
+ 'at': 920,
+ 'A': 611,
+ 'B': 611,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 611,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 444,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 667,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 611,
+ 'S': 500,
+ 'T': 556,
+ 'U': 722,
+ 'V': 611,
+ 'W': 833,
+ 'X': 611,
+ 'Y': 556,
+ 'Z': 556,
+ 'bracketleft': 389,
+ 'backslash': 278,
+ 'bracketright': 389,
+ 'asciicircum': 422,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 278,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 444,
+ 'l': 278,
+ 'm': 722,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 444,
+ 'w': 667,
+ 'x': 444,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 400,
+ 'bar': 275,
+ 'braceright': 400,
+ 'asciitilde': 541,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 214,
+ 'quotedblleft': 556,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 523,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 556,
+ 'quotedblright': 556,
+ 'guillemotright': 500,
+ 'ellipsis': 889,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 889,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 556,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 667,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 556,
+ 'divide': 675,
+ 'Yacute': 556,
+ 'Acircumflex': 611,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 667,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 556,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 611,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 500,
+ 'Amacron': 611,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 556,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 611,
+ 'Sacute': 500,
+ 'dcaron': 544,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 611,
+ 'Abreve': 611,
+ 'multiply': 675,
+ 'uacute': 500,
+ 'Tcaron': 556,
+ 'partialdiff': 476,
+ 'ydieresis': 444,
+ 'Nacute': 667,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 667,
+ 'Iacute': 333,
+ 'plusminus': 675,
+ 'brokenbar': 275,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 556,
+ 'Zcaron': 556,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 300,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 611,
+ 'Adieresis': 611,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 500,
+ 'lcaron': 300,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 500,
+ 'Scommaaccent': 500,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 667,
+ 'otilde': 500,
+ 'Rcommaaccent': 611,
+ 'Lcommaaccent': 556,
+ 'Atilde': 611,
+ 'Aogonek': 611,
+ 'Aring': 611,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 444,
+ 'minus': 675,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 675,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'ZapfDingbats': {
+ 'space': 278,
+ 'a1': 974,
+ 'a2': 961,
+ 'a202': 974,
+ 'a3': 980,
+ 'a4': 719,
+ 'a5': 789,
+ 'a119': 790,
+ 'a118': 791,
+ 'a117': 690,
+ 'a11': 960,
+ 'a12': 939,
+ 'a13': 549,
+ 'a14': 855,
+ 'a15': 911,
+ 'a16': 933,
+ 'a105': 911,
+ 'a17': 945,
+ 'a18': 974,
+ 'a19': 755,
+ 'a20': 846,
+ 'a21': 762,
+ 'a22': 761,
+ 'a23': 571,
+ 'a24': 677,
+ 'a25': 763,
+ 'a26': 760,
+ 'a27': 759,
+ 'a28': 754,
+ 'a6': 494,
+ 'a7': 552,
+ 'a8': 537,
+ 'a9': 577,
+ 'a10': 692,
+ 'a29': 786,
+ 'a30': 788,
+ 'a31': 788,
+ 'a32': 790,
+ 'a33': 793,
+ 'a34': 794,
+ 'a35': 816,
+ 'a36': 823,
+ 'a37': 789,
+ 'a38': 841,
+ 'a39': 823,
+ 'a40': 833,
+ 'a41': 816,
+ 'a42': 831,
+ 'a43': 923,
+ 'a44': 744,
+ 'a45': 723,
+ 'a46': 749,
+ 'a47': 790,
+ 'a48': 792,
+ 'a49': 695,
+ 'a50': 776,
+ 'a51': 768,
+ 'a52': 792,
+ 'a53': 759,
+ 'a54': 707,
+ 'a55': 708,
+ 'a56': 682,
+ 'a57': 701,
+ 'a58': 826,
+ 'a59': 815,
+ 'a60': 789,
+ 'a61': 789,
+ 'a62': 707,
+ 'a63': 687,
+ 'a64': 696,
+ 'a65': 689,
+ 'a66': 786,
+ 'a67': 787,
+ 'a68': 713,
+ 'a69': 791,
+ 'a70': 785,
+ 'a71': 791,
+ 'a72': 873,
+ 'a73': 761,
+ 'a74': 762,
+ 'a203': 762,
+ 'a75': 759,
+ 'a204': 759,
+ 'a76': 892,
+ 'a77': 892,
+ 'a78': 788,
+ 'a79': 784,
+ 'a81': 438,
+ 'a82': 138,
+ 'a83': 277,
+ 'a84': 415,
+ 'a97': 392,
+ 'a98': 392,
+ 'a99': 668,
+ 'a100': 668,
+ 'a89': 390,
+ 'a90': 390,
+ 'a93': 317,
+ 'a94': 317,
+ 'a91': 276,
+ 'a92': 276,
+ 'a205': 509,
+ 'a85': 509,
+ 'a206': 410,
+ 'a86': 410,
+ 'a87': 234,
+ 'a88': 234,
+ 'a95': 334,
+ 'a96': 334,
+ 'a101': 732,
+ 'a102': 544,
+ 'a103': 544,
+ 'a104': 910,
+ 'a106': 667,
+ 'a107': 760,
+ 'a108': 760,
+ 'a112': 776,
+ 'a111': 595,
+ 'a110': 694,
+ 'a109': 626,
+ 'a120': 788,
+ 'a121': 788,
+ 'a122': 788,
+ 'a123': 788,
+ 'a124': 788,
+ 'a125': 788,
+ 'a126': 788,
+ 'a127': 788,
+ 'a128': 788,
+ 'a129': 788,
+ 'a130': 788,
+ 'a131': 788,
+ 'a132': 788,
+ 'a133': 788,
+ 'a134': 788,
+ 'a135': 788,
+ 'a136': 788,
+ 'a137': 788,
+ 'a138': 788,
+ 'a139': 788,
+ 'a140': 788,
+ 'a141': 788,
+ 'a142': 788,
+ 'a143': 788,
+ 'a144': 788,
+ 'a145': 788,
+ 'a146': 788,
+ 'a147': 788,
+ 'a148': 788,
+ 'a149': 788,
+ 'a150': 788,
+ 'a151': 788,
+ 'a152': 788,
+ 'a153': 788,
+ 'a154': 788,
+ 'a155': 788,
+ 'a156': 788,
+ 'a157': 788,
+ 'a158': 788,
+ 'a159': 788,
+ 'a160': 894,
+ 'a161': 838,
+ 'a163': 1016,
+ 'a164': 458,
+ 'a196': 748,
+ 'a165': 924,
+ 'a192': 748,
+ 'a166': 918,
+ 'a167': 927,
+ 'a168': 928,
+ 'a169': 928,
+ 'a170': 834,
+ 'a171': 873,
+ 'a172': 828,
+ 'a173': 924,
+ 'a162': 924,
+ 'a174': 917,
+ 'a175': 930,
+ 'a176': 931,
+ 'a177': 463,
+ 'a178': 883,
+ 'a179': 836,
+ 'a193': 836,
+ 'a180': 867,
+ 'a199': 867,
+ 'a181': 696,
+ 'a200': 696,
+ 'a182': 874,
+ 'a201': 874,
+ 'a183': 760,
+ 'a184': 946,
+ 'a197': 771,
+ 'a185': 865,
+ 'a194': 771,
+ 'a198': 888,
+ 'a186': 967,
+ 'a195': 888,
+ 'a187': 831,
+ 'a188': 873,
+ 'a189': 927,
+ 'a190': 970,
+ 'a191': 918
+ }
+};
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var EOF = {};
+
+function isEOF(v) {
+ return v == EOF;
+}
+
+var Parser = (function parserParser() {
+ function constructor(lexer, allowStreams, xref) {
+ this.lexer = lexer;
+ this.allowStreams = allowStreams;
+ this.xref = xref;
+ this.inlineImg = 0;
+ this.refill();
+ }
+
+ constructor.prototype = {
+ refill: function parserRefill() {
+ this.buf1 = this.lexer.getObj();
+ this.buf2 = this.lexer.getObj();
+ },
+ shift: function parserShift() {
+ if (isCmd(this.buf2, 'ID')) {
+ this.buf1 = this.buf2;
+ this.buf2 = null;
+ // skip byte after ID
+ this.lexer.skip();
+ } else {
+ this.buf1 = this.buf2;
+ this.buf2 = this.lexer.getObj();
+ }
+ },
+ getObj: function parserGetObj(cipherTransform) {
+ if (isCmd(this.buf1, 'BI')) { // inline image
+ this.shift();
+ return this.makeInlineImage(cipherTransform);
+ }
+ if (isCmd(this.buf1, '[')) { // array
+ this.shift();
+ var array = [];
+ while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
+ array.push(this.getObj());
+ if (isEOF(this.buf1))
+ error('End of file inside array');
+ this.shift();
+ return array;
+ }
+ if (isCmd(this.buf1, '<<')) { // dictionary or stream
+ this.shift();
+ var dict = new Dict();
+ while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ error('Dictionary key must be a name object');
+ } else {
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1))
+ break;
+ dict.set(key, this.getObj(cipherTransform));
+ }
+ }
+ if (isEOF(this.buf1))
+ error('End of file inside dictionary');
+
+ // stream objects are not allowed inside content streams or
+ // object streams
+ if (isCmd(this.buf2, 'stream')) {
+ return this.allowStreams ?
+ this.makeStream(dict, cipherTransform) : dict;
+ }
+ this.shift();
+ return dict;
+ }
+ if (isInt(this.buf1)) { // indirect reference or integer
+ var num = this.buf1;
+ this.shift();
+ if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
+ var ref = new Ref(num, this.buf1);
+ this.shift();
+ this.shift();
+ return ref;
+ }
+ return num;
+ }
+ if (isString(this.buf1)) { // string
+ var str = this.buf1;
+ this.shift();
+ if (cipherTransform)
+ str = cipherTransform.decryptString(str);
+ return str;
+ }
+
+ // simple object
+ var obj = this.buf1;
+ this.shift();
+ return obj;
+ },
+ makeInlineImage: function parserMakeInlineImage(cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // parse dictionary
+ var dict = new Dict();
+ while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ error('Dictionary key must be a name object');
+ } else {
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1))
+ break;
+ dict.set(key, this.getObj(cipherTransform));
+ }
+ }
+
+ // parse image stream
+ var startPos = stream.pos;
+
+ // searching for the /\sEI\s/
+ var state = 0, ch;
+ while (state != 4 && (ch = stream.getByte()) != null) {
+ switch (ch) {
+ case 0x20:
+ case 0x0D:
+ case 0x0A:
+ state = state === 3 ? 4 : 1;
+ break;
+ case 0x45:
+ state = state === 1 ? 2 : 0;
+ break;
+ case 0x49:
+ state = state === 2 ? 3 : 0;
+ break;
+ default:
+ state = 0;
+ break;
+ }
+ }
+
+ // TODO improve the small images performance to remove the limit
+ var inlineImgLimit = 500;
+ if (++this.inlineImg >= inlineImgLimit) {
+ if (this.inlineImg === inlineImgLimit)
+ warn('Too many inline images');
+ this.shift();
+ return null;
+ }
+
+ var length = (stream.pos - 4) - startPos;
+ var imageStream = stream.makeSubStream(startPos, length, dict);
+ if (cipherTransform)
+ imageStream = cipherTransform.createStream(imageStream);
+ imageStream = this.filter(imageStream, dict, length);
+ imageStream.parameters = dict;
+
+ this.buf2 = new Cmd('EI');
+ this.shift();
+
+ return imageStream;
+ },
+ makeStream: function parserMakeStream(dict, cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // get stream start position
+ lexer.skipToNextLine();
+ var pos = stream.pos;
+
+ // get length
+ var length = dict.get('Length');
+ var xref = this.xref;
+ if (xref)
+ length = xref.fetchIfRef(length);
+ if (!isInt(length)) {
+ error('Bad ' + length + ' attribute in stream');
+ length = 0;
+ }
+
+ // skip over the stream data
+ stream.pos = pos + length;
+ this.shift(); // '>>'
+ this.shift(); // 'stream'
+ if (!isCmd(this.buf1, 'endstream'))
+ error('Missing endstream');
+ this.shift();
+
+ stream = stream.makeSubStream(pos, length, dict);
+ if (cipherTransform)
+ stream = cipherTransform.createStream(stream);
+ stream = this.filter(stream, dict, length);
+ stream.parameters = dict;
+ return stream;
+ },
+ filter: function parserFilter(stream, dict, length) {
+ var filter = dict.get('Filter', 'F');
+ var params = dict.get('DecodeParms', 'DP');
+ if (isName(filter))
+ return this.makeFilter(stream, filter.name, length, params);
+ if (isArray(filter)) {
+ var filterArray = filter;
+ var paramsArray = params;
+ for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+ filter = filterArray[i];
+ if (!isName(filter))
+ error('Bad filter name: ' + filter);
+ else {
+ params = null;
+ if (isArray(paramsArray) && (i in paramsArray))
+ params = paramsArray[i];
+ stream = this.makeFilter(stream, filter.name, length, params);
+ // after the first stream the length variable is invalid
+ length = null;
+ }
+ }
+ }
+ return stream;
+ },
+ makeFilter: function parserMakeFilter(stream, name, length, params) {
+ if (name == 'FlateDecode' || name == 'Fl') {
+ if (params) {
+ return new PredictorStream(new FlateStream(stream), params);
+ }
+ return new FlateStream(stream);
+ } else if (name == 'LZWDecode' || name == 'LZW') {
+ var earlyChange = 1;
+ if (params) {
+ if (params.has('EarlyChange'))
+ earlyChange = params.get('EarlyChange');
+ return new PredictorStream(
+ new LZWStream(stream, earlyChange), params);
+ }
+ return new LZWStream(stream, earlyChange);
+ } else if (name == 'DCTDecode' || name == 'DCT') {
+ var bytes = stream.getBytes(length);
+ return new JpegStream(bytes, stream.dict, this.xref);
+ } else if (name == 'ASCII85Decode' || name == 'A85') {
+ return new Ascii85Stream(stream);
+ } else if (name == 'ASCIIHexDecode' || name == 'AHx') {
+ return new AsciiHexStream(stream);
+ } else if (name == 'CCITTFaxDecode' || name == 'CCF') {
+ return new CCITTFaxStream(stream, params);
+ } else {
+ TODO('filter "' + name + '" not supported yet');
+ }
+ return stream;
+ }
+ };
+
+ return constructor;
+})();
+
+var Lexer = (function lexer() {
+ function constructor(stream) {
+ this.stream = stream;
+ }
+
+ constructor.isSpace = function lexerIsSpace(ch) {
+ return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
+ };
+
+ // A '1' in this array means the character is white space. A '1' or
+ // '2' means the character ends a name or command.
+ var specialChars = [
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
+ 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
+ ];
+
+ function toHexDigit(ch) {
+ if (ch >= '0' && ch <= '9')
+ return ch.charCodeAt(0) - 48;
+ ch = ch.toUpperCase();
+ if (ch >= 'A' && ch <= 'F')
+ return ch.charCodeAt(0) - 55;
+ return -1;
+ }
+
+ constructor.prototype = {
+ getNumber: function lexerGetNumber(ch) {
+ var floating = false;
+ var str = ch;
+ var stream = this.stream;
+ for (;;) {
+ ch = stream.lookChar();
+ if (ch == '.' && !floating) {
+ str += ch;
+ floating = true;
+ } else if (ch == '-') {
+ // ignore minus signs in the middle of numbers to match
+ // Adobe's behavior
+ warn('Badly formated number');
+ } else if (ch >= '0' && ch <= '9') {
+ str += ch;
+ } else if (ch == 'e' || ch == 'E') {
+ floating = true;
+ } else {
+ // the last character doesn't belong to us
+ break;
+ }
+ stream.skip();
+ }
+ var value = parseFloat(str);
+ if (isNaN(value))
+ error('Invalid floating point number: ' + value);
+ return value;
+ },
+ getString: function lexerGetString() {
+ var numParen = 1;
+ var done = false;
+ var str = '';
+ var stream = this.stream;
+ var ch;
+ do {
+ ch = stream.getChar();
+ switch (ch) {
+ case undefined:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case '(':
+ ++numParen;
+ str += ch;
+ break;
+ case ')':
+ if (--numParen == 0) {
+ done = true;
+ } else {
+ str += ch;
+ }
+ break;
+ case '\\':
+ ch = stream.getChar();
+ switch (ch) {
+ case undefined:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case 'n':
+ str += '\n';
+ break;
+ case 'r':
+ str += '\r';
+ break;
+ case 't':
+ str += '\t';
+ break;
+ case 'b':
+ str += '\b';
+ break;
+ case 'f':
+ str += '\f';
+ break;
+ case '\\':
+ case '(':
+ case ')':
+ str += ch;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ var x = ch - '0';
+ ch = stream.lookChar();
+ if (ch >= '0' && ch <= '7') {
+ stream.skip();
+ x = (x << 3) + (ch - '0');
+ ch = stream.lookChar();
+ if (ch >= '0' && ch <= '7') {
+ stream.skip();
+ x = (x << 3) + (ch - '0');
+ }
+ }
+
+ str += String.fromCharCode(x);
+ break;
+ case '\r':
+ ch = stream.lookChar();
+ if (ch == '\n')
+ stream.skip();
+ break;
+ case '\n':
+ break;
+ default:
+ str += ch;
+ }
+ break;
+ default:
+ str += ch;
+ }
+ } while (!done);
+ return str;
+ },
+ getName: function lexerGetName(ch) {
+ var str = '';
+ var stream = this.stream;
+ while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+ stream.skip();
+ if (ch == '#') {
+ ch = stream.lookChar();
+ var x = toHexDigit(ch);
+ if (x != -1) {
+ stream.skip();
+ var x2 = toHexDigit(stream.getChar());
+ if (x2 == -1)
+ error('Illegal digit in hex char in name: ' + x2);
+ str += String.fromCharCode((x << 4) | x2);
+ } else {
+ str += '#';
+ str += ch;
+ }
+ } else {
+ str += ch;
+ }
+ }
+ if (str.length > 128)
+ error('Warning: name token is longer than allowed by the spec: ' +
+ str.length);
+ return new Name(str);
+ },
+ getHexString: function lexerGetHexString(ch) {
+ var str = '';
+ var stream = this.stream;
+ for (;;) {
+ ch = stream.getChar();
+ if (ch == '>') {
+ break;
+ }
+ if (!ch) {
+ warn('Unterminated hex string');
+ break;
+ }
+ if (specialChars[ch.charCodeAt(0)] != 1) {
+ var x, x2;
+ if ((x = toHexDigit(ch)) == -1)
+ error('Illegal character in hex string: ' + ch);
+
+ ch = stream.getChar();
+ while (specialChars[ch.charCodeAt(0)] == 1)
+ ch = stream.getChar();
+
+ if ((x2 = toHexDigit(ch)) == -1)
+ error('Illegal character in hex string: ' + ch);
+
+ str += String.fromCharCode((x << 4) | x2);
+ }
+ }
+ return str;
+ },
+ getObj: function lexerGetObj() {
+ // skip whitespace and comments
+ var comment = false;
+ var stream = this.stream;
+ var ch;
+ while (true) {
+ if (!(ch = stream.getChar()))
+ return EOF;
+ if (comment) {
+ if (ch == '\r' || ch == '\n')
+ comment = false;
+ } else if (ch == '%') {
+ comment = true;
+ } else if (specialChars[ch.charCodeAt(0)] != 1) {
+ break;
+ }
+ }
+
+ // start reading token
+ switch (ch) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '+': case '-': case '.':
+ return this.getNumber(ch);
+ case '(':
+ return this.getString();
+ case '/':
+ return this.getName(ch);
+ // array punctuation
+ case '[':
+ case ']':
+ return new Cmd(ch);
+ // hex string or dict punctuation
+ case '<':
+ ch = stream.lookChar();
+ if (ch == '<') {
+ // dict punctuation
+ stream.skip();
+ return new Cmd('<<');
+ }
+ return this.getHexString(ch);
+ // dict punctuation
+ case '>':
+ ch = stream.lookChar();
+ if (ch == '>') {
+ stream.skip();
+ return new Cmd('>>');
+ }
+ case '{':
+ case '}':
+ return new Cmd(ch);
+ // fall through
+ case ')':
+ error('Illegal character: ' + ch);
+ return Error;
+ }
+
+ // command
+ var str = ch;
+ while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+ stream.skip();
+ if (str.length == 128) {
+ error('Command token too long: ' + str.length);
+ break;
+ }
+ str += ch;
+ }
+ if (str == 'true')
+ return true;
+ if (str == 'false')
+ return false;
+ if (str == 'null')
+ return null;
+ return new Cmd(str);
+ },
+ skipToNextLine: function lexerSkipToNextLine() {
+ var stream = this.stream;
+ while (true) {
+ var ch = stream.getChar();
+ if (!ch || ch == '\n')
+ return;
+ if (ch == '\r') {
+ if ((ch = stream.lookChar()) == '\n')
+ stream.skip();
+ return;
+ }
+ }
+ },
+ skip: function lexerSkip() {
+ this.stream.skip();
+ }
+ };
+
+ return constructor;
+})();
+
+var Linearization = (function linearizationLinearization() {
+ function constructor(stream) {
+ this.parser = new Parser(new Lexer(stream), false);
+ var obj1 = this.parser.getObj();
+ var obj2 = this.parser.getObj();
+ var obj3 = this.parser.getObj();
+ this.linDict = this.parser.getObj();
+ if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
+ isDict(this.linDict)) {
+ var obj = this.linDict.get('Linearized');
+ if (!(isNum(obj) && obj > 0))
+ this.linDict = null;
+ }
+ }
+
+ constructor.prototype = {
+ getInt: function linearizationGetInt(name) {
+ var linDict = this.linDict;
+ var obj;
+ if (isDict(linDict) &&
+ isInt(obj = linDict.get(name)) &&
+ obj > 0) {
+ return obj;
+ }
+ error('"' + name + '" field in linearization table is invalid');
+ return 0;
+ },
+ getHint: function linearizationGetHint(index) {
+ var linDict = this.linDict;
+ var obj1, obj2;
+ if (isDict(linDict) &&
+ isArray(obj1 = linDict.get('H')) &&
+ obj1.length >= 2 &&
+ isInt(obj2 = obj1[index]) &&
+ obj2 > 0) {
+ return obj2;
+ }
+ error('Hints table in linearization table is invalid: ' + index);
+ return 0;
+ },
+ get length() {
+ if (!isDict(this.linDict))
+ return 0;
+ return this.getInt('L');
+ },
+ get hintsOffset() {
+ return this.getHint(0);
+ },
+ get hintsLength() {
+ return this.getHint(1);
+ },
+ get hintsOffset2() {
+ return this.getHint(2);
+ },
+ get hintsLenth2() {
+ return this.getHint(3);
+ },
+ get objectNumberFirst() {
+ return this.getInt('O');
+ },
+ get endFirst() {
+ return this.getInt('E');
+ },
+ get numPages() {
+ return this.getInt('N');
+ },
+ get mainXRefEntriesOffset() {
+ return this.getInt('T');
+ },
+ get pageFirst() {
+ return this.getInt('P');
+ }
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Pattern = (function patternPattern() {
+ // Constructor should define this.getPattern
+ function constructor() {
+ error('should not call Pattern constructor');
+ }
+
+ constructor.prototype = {
+ // Input: current Canvas context
+ // Output: the appropriate fillStyle or strokeStyle
+ getPattern: function pattern_getStyle(ctx) {
+ error('Should not call Pattern.getStyle: ' + ctx);
+ }
+ };
+
+ constructor.shadingFromIR = function pattern_shadingFromIR(ctx, raw) {
+ return Shadings[raw[0]].fromIR(ctx, raw);
+ };
+
+ constructor.parseShading = function pattern_shading(shading, matrix, xref,
+ res, ctx) {
+
+ var dict = isStream(shading) ? shading.dict : shading;
+ var type = dict.get('ShadingType');
+
+ switch (type) {
+ case 2:
+ case 3:
+ // both radial and axial shadings are handled by RadialAxial shading
+ return new Shadings.RadialAxial(dict, matrix, xref, res, ctx);
+ default:
+ return new Shadings.Dummy();
+ }
+ };
+ return constructor;
+})();
+
+var Shadings = {};
+
+// Radial and axial shading have very similar implementations
+// If needed, the implementations can be broken into two classes
+Shadings.RadialAxial = (function radialAxialShading() {
+ function constructor(dict, matrix, xref, res, ctx) {
+ this.matrix = matrix;
+ this.coordsArr = dict.get('Coords');
+ this.shadingType = dict.get('ShadingType');
+ this.type = 'Pattern';
+
+ this.ctx = ctx;
+ var cs = dict.get('ColorSpace', 'CS');
+ cs = ColorSpace.parse(cs, xref, res);
+ this.cs = cs;
+
+ var t0 = 0.0, t1 = 1.0;
+ if (dict.has('Domain')) {
+ var domainArr = dict.get('Domain');
+ t0 = domainArr[0];
+ t1 = domainArr[1];
+ }
+
+ var extendStart = false, extendEnd = false;
+ if (dict.has('Extend')) {
+ var extendArr = dict.get('Extend');
+ extendStart = extendArr[0];
+ extendEnd = extendArr[1];
+ TODO('Support extend');
+ }
+
+ this.extendStart = extendStart;
+ this.extendEnd = extendEnd;
+
+ var fnObj = dict.get('Function');
+ fnObj = xref.fetchIfRef(fnObj);
+ if (isArray(fnObj))
+ error('No support for array of functions');
+ else if (!isPDFFunction(fnObj))
+ error('Invalid function');
+ var fn = PDFFunction.parse(xref, fnObj);
+
+ // 10 samples seems good enough for now, but probably won't work
+ // if there are sharp color changes. Ideally, we would implement
+ // the spec faithfully and add lossless optimizations.
+ var step = (t1 - t0) / 10;
+ var diff = t1 - t0;
+
+ var colorStops = [];
+ for (var i = t0; i <= t1; i += step) {
+ var color = fn([i]);
+ var rgbColor = Util.makeCssRgb.apply(this, cs.getRgb(color));
+ colorStops.push([(i - t0) / diff, rgbColor]);
+ }
+
+ this.colorStops = colorStops;
+ }
+
+ constructor.fromIR = function radialAxialShadingGetIR(ctx, raw) {
+ var type = raw[1];
+ var colorStops = raw[2];
+ var p0 = raw[3];
+ var p1 = raw[4];
+ var r0 = raw[5];
+ var r1 = raw[6];
+
+ var curMatrix = ctx.mozCurrentTransform;
+ if (curMatrix) {
+ var userMatrix = ctx.mozCurrentTransformInverse;
+
+ p0 = Util.applyTransform(p0, curMatrix);
+ p0 = Util.applyTransform(p0, userMatrix);
+
+ p1 = Util.applyTransform(p1, curMatrix);
+ p1 = Util.applyTransform(p1, userMatrix);
+ }
+
+ var grad;
+ if (type == 2)
+ grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+ else if (type == 3)
+ grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+
+ for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+ var c = colorStops[i];
+ grad.addColorStop(c[0], c[1]);
+ }
+ return grad;
+ };
+
+ constructor.prototype = {
+ getIR: function radialAxialShadingGetIR() {
+ var coordsArr = this.coordsArr;
+ var type = this.shadingType;
+ if (type == 2) {
+ var p0 = [coordsArr[0], coordsArr[1]];
+ var p1 = [coordsArr[2], coordsArr[3]];
+ var r0 = null;
+ var r1 = null;
+ } else if (type == 3) {
+ var p0 = [coordsArr[0], coordsArr[1]];
+ var p1 = [coordsArr[3], coordsArr[4]];
+ var r0 = coordsArr[2];
+ var r1 = coordsArr[5];
+ } else {
+ error('getPattern type unknown: ' + type);
+ }
+
+ var matrix = this.matrix;
+ if (matrix) {
+ p0 = Util.applyTransform(p0, matrix);
+ p1 = Util.applyTransform(p1, matrix);
+ }
+
+ return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+ }
+ };
+
+ return constructor;
+})();
+
+Shadings.Dummy = (function dummyShading() {
+ function constructor() {
+ this.type = 'Pattern';
+ }
+
+ constructor.fromIR = function dummyShadingFromIR() {
+ return 'hotpink';
+ };
+
+ constructor.prototype = {
+ getIR: function dummyShadingGetIR() {
+ return ['Dummy'];
+ }
+ };
+ return constructor;
+})();
+
+var TilingPattern = (function tilingPattern() {
+ var PAINT_TYPE_COLORED = 1, PAINT_TYPE_UNCOLORED = 2;
+
+ function TilingPattern(IR, color, ctx, objs) {
+ var IRQueue = IR[2];
+ this.matrix = IR[3];
+ var bbox = IR[4];
+ var xstep = IR[5];
+ var ystep = IR[6];
+ var paintType = IR[7];
+
+ TODO('TilingType');
+
+ this.curMatrix = ctx.mozCurrentTransform;
+ this.invMatrix = ctx.mozCurrentTransformInverse;
+ this.ctx = ctx;
+ this.type = 'Pattern';
+
+ var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
+
+ var topLeft = [x0, y0];
+ // we want the canvas to be as large as the step size
+ var botRight = [x0 + xstep, y0 + ystep];
+
+ var width = botRight[0] - topLeft[0];
+ var height = botRight[1] - topLeft[1];
+
+ // TODO: hack to avoid OOM, we would idealy compute the tiling
+ // pattern to be only as large as the acual size in device space
+ // This could be computed with .mozCurrentTransform, but still
+ // needs to be implemented
+ while (Math.abs(width) > 512 || Math.abs(height) > 512) {
+ width = 512;
+ height = 512;
+ }
+
+ var tmpCanvas = new ScratchCanvas(width, height);
+
+ // set the new canvas element context as the graphics context
+ var tmpCtx = tmpCanvas.getContext('2d');
+ var graphics = new CanvasGraphics(tmpCtx, objs);
+
+ switch (paintType) {
+ case PAINT_TYPE_COLORED:
+ tmpCtx.fillStyle = ctx.fillStyle;
+ tmpCtx.strokeStyle = ctx.strokeStyle;
+ break;
+ case PAINT_TYPE_UNCOLORED:
+ color = Util.makeCssRgb.apply(this, color);
+ tmpCtx.fillStyle = color;
+ tmpCtx.strokeStyle = color;
+ break;
+ default:
+ error('Unsupported paint type: ' + paintType);
+ }
+
+ var scale = [width / xstep, height / ystep];
+ this.scale = scale;
+
+ // transform coordinates to pattern space
+ var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+ var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+ graphics.transform.apply(graphics, tmpScale);
+ graphics.transform.apply(graphics, tmpTranslate);
+
+ if (bbox && isArray(bbox) && 4 == bbox.length) {
+ var bboxWidth = x1 - x0;
+ var bboxHeight = y1 - y0;
+ graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
+ graphics.clip();
+ graphics.endPath();
+ }
+
+ graphics.executeIRQueue(IRQueue);
+
+ this.canvas = tmpCanvas;
+ }
+
+ TilingPattern.getIR = function tiling_getIR(codeIR, dict, args) {
+ var matrix = dict.get('Matrix');
+ var bbox = dict.get('BBox');
+ var xstep = dict.get('XStep');
+ var ystep = dict.get('YStep');
+ var paintType = dict.get('PaintType');
+
+ return [
+ 'TilingPattern', args, codeIR, matrix, bbox, xstep, ystep, paintType
+ ];
+ };
+
+ TilingPattern.prototype = {
+ getPattern: function tiling_getPattern() {
+ var matrix = this.matrix;
+ var curMatrix = this.curMatrix;
+ var ctx = this.ctx;
+
+ if (curMatrix)
+ ctx.setTransform.apply(ctx, curMatrix);
+
+ if (matrix)
+ ctx.transform.apply(ctx, matrix);
+
+ var scale = this.scale;
+ ctx.scale(1 / scale[0], 1 / scale[1]);
+
+ return ctx.createPattern(this.canvas, 'repeat');
+ }
+ };
+
+ return TilingPattern;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Stream = (function streamStream() {
+ function constructor(arrayBuffer, start, length, dict) {
+ this.bytes = new Uint8Array(arrayBuffer);
+ this.start = start || 0;
+ this.pos = this.start;
+ this.end = (start + length) || this.bytes.length;
+ this.dict = dict;
+ }
+
+ // required methods for a stream. if a particular stream does not
+ // implement these, an error should be thrown
+ constructor.prototype = {
+ get length() {
+ return this.end - this.start;
+ },
+ getByte: function stream_getByte() {
+ if (this.pos >= this.end)
+ return null;
+ return this.bytes[this.pos++];
+ },
+ // returns subarray of original buffer
+ // should only be read
+ getBytes: function stream_getBytes(length) {
+ var bytes = this.bytes;
+ var pos = this.pos;
+ var strEnd = this.end;
+
+ if (!length)
+ return bytes.subarray(pos, strEnd);
+
+ var end = pos + length;
+ if (end > strEnd)
+ end = strEnd;
+
+ this.pos = end;
+ return bytes.subarray(pos, end);
+ },
+ lookChar: function stream_lookChar() {
+ if (this.pos >= this.end)
+ return null;
+ return String.fromCharCode(this.bytes[this.pos]);
+ },
+ getChar: function stream_getChar() {
+ if (this.pos >= this.end)
+ return null;
+ return String.fromCharCode(this.bytes[this.pos++]);
+ },
+ skip: function stream_skip(n) {
+ if (!n)
+ n = 1;
+ this.pos += n;
+ },
+ reset: function stream_reset() {
+ this.pos = this.start;
+ },
+ moveStart: function stream_moveStart() {
+ this.start = this.pos;
+ },
+ makeSubStream: function stream_makeSubstream(start, length, dict) {
+ return new Stream(this.bytes.buffer, start, length, dict);
+ },
+ isStream: true
+ };
+
+ return constructor;
+})();
+
+var StringStream = (function stringStream() {
+ function constructor(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var n = 0; n < length; ++n)
+ bytes[n] = str.charCodeAt(n);
+ Stream.call(this, bytes);
+ }
+
+ constructor.prototype = Stream.prototype;
+
+ return constructor;
+})();
+
+// super class for the decoding streams
+var DecodeStream = (function decodeStream() {
+ function constructor() {
+ this.pos = 0;
+ this.bufferLength = 0;
+ this.eof = false;
+ this.buffer = null;
+ }
+
+ constructor.prototype = {
+ ensureBuffer: function decodestream_ensureBuffer(requested) {
+ var buffer = this.buffer;
+ var current = buffer ? buffer.byteLength : 0;
+ if (requested < current)
+ return buffer;
+ var size = 512;
+ while (size < requested)
+ size <<= 1;
+ var buffer2 = new Uint8Array(size);
+ for (var i = 0; i < current; ++i)
+ buffer2[i] = buffer[i];
+ return (this.buffer = buffer2);
+ },
+ getByte: function decodestream_getByte() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return this.buffer[this.pos++];
+ },
+ getBytes: function decodestream_getBytes(length) {
+ var end, pos = this.pos;
+
+ if (length) {
+ this.ensureBuffer(pos + length);
+ end = pos + length;
+
+ while (!this.eof && this.bufferLength < end)
+ this.readBlock();
+
+ var bufEnd = this.bufferLength;
+ if (end > bufEnd)
+ end = bufEnd;
+ } else {
+ while (!this.eof)
+ this.readBlock();
+
+ end = this.bufferLength;
+
+ // checking if bufferLength is still 0 then
+ // the buffer has to be initialized
+ if (!end)
+ this.buffer = new Uint8Array(0);
+ }
+
+ this.pos = end;
+ return this.buffer.subarray(pos, end);
+ },
+ lookChar: function decodestream_lookChar() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return String.fromCharCode(this.buffer[this.pos]);
+ },
+ getChar: function decodestream_getChar() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return String.fromCharCode(this.buffer[this.pos++]);
+ },
+ makeSubStream: function decodestream_makeSubstream(start, length, dict) {
+ var end = start + length;
+ while (this.bufferLength <= end && !this.eof)
+ this.readBlock();
+ return new Stream(this.buffer, start, length, dict);
+ },
+ skip: function decodestream_skip(n) {
+ if (!n)
+ n = 1;
+ this.pos += n;
+ },
+ reset: function decodestream_reset() {
+ this.pos = 0;
+ }
+ };
+
+ return constructor;
+})();
+
+var FakeStream = (function fakeStream() {
+ function constructor(stream) {
+ this.dict = stream.dict;
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+ constructor.prototype.readBlock = function fakeStreamReadBlock() {
+ var bufferLength = this.bufferLength;
+ bufferLength += 1024;
+ var buffer = this.ensureBuffer(bufferLength);
+ this.bufferLength = bufferLength;
+ };
+
+ constructor.prototype.getBytes = function fakeStreamGetBytes(length) {
+ var end, pos = this.pos;
+
+ if (length) {
+ this.ensureBuffer(pos + length);
+ end = pos + length;
+
+ while (!this.eof && this.bufferLength < end)
+ this.readBlock();
+
+ var bufEnd = this.bufferLength;
+ if (end > bufEnd)
+ end = bufEnd;
+ } else {
+ this.eof = true;
+ end = this.bufferLength;
+ }
+
+ this.pos = end;
+ return this.buffer.subarray(pos, end);
+ };
+
+ return constructor;
+})();
+
+var StreamsSequenceStream = (function streamSequenceStream() {
+ function constructor(streams) {
+ this.streams = streams;
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function streamSequenceStreamReadBlock() {
+ var streams = this.streams;
+ if (streams.length == 0) {
+ this.eof = true;
+ return;
+ }
+ var stream = streams.shift();
+ var chunk = stream.getBytes();
+ var bufferLength = this.bufferLength;
+ var newLength = bufferLength + chunk.length;
+ var buffer = this.ensureBuffer(newLength);
+ buffer.set(chunk, bufferLength);
+ this.bufferLength = newLength;
+ };
+
+ return constructor;
+})();
+
+var FlateStream = (function flateStream() {
+ var codeLenCodeMap = new Uint32Array([
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+ ]);
+
+ var lengthDecode = new Uint32Array([
+ 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+ 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+ 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+ 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+ ]);
+
+ var distDecode = new Uint32Array([
+ 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+ 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+ 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+ 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+ ]);
+
+ var fixedLitCodeTab = [new Uint32Array([
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+ 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+ 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+ 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+ 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+ 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+ 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+ 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+ 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+ 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+ 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+ 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+ 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+ 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+ 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+ 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+ 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+ 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+ 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+ 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+ 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+ 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+ 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+ 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+ 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+ 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+ 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+ 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+ 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+ 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+ 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+ 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+ 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+ 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+ 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+ 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+ 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+ 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+ 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+ 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+ 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+ ]), 9];
+
+ var fixedDistCodeTab = [new Uint32Array([
+ 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+ 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+ 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+ 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+ ]), 5];
+
+ function constructor(stream) {
+ var bytes = stream.getBytes();
+ var bytesPos = 0;
+
+ this.dict = stream.dict;
+ var cmf = bytes[bytesPos++];
+ var flg = bytes[bytesPos++];
+ if (cmf == -1 || flg == -1)
+ error('Invalid header in flate stream: ' + cmf + ', ' + flg);
+ if ((cmf & 0x0f) != 0x08)
+ error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+ if ((((cmf << 8) + flg) % 31) != 0)
+ error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+ if (flg & 0x20)
+ error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+
+ this.bytes = bytes;
+ this.bytesPos = bytesPos;
+
+ this.codeSize = 0;
+ this.codeBuf = 0;
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.getBits = function flateStreamGetBits(bits) {
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+
+ var b;
+ while (codeSize < bits) {
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad encoding in flate stream');
+ codeBuf |= b << codeSize;
+ codeSize += 8;
+ }
+ b = codeBuf & ((1 << bits) - 1);
+ this.codeBuf = codeBuf >> bits;
+ this.codeSize = codeSize -= bits;
+ this.bytesPos = bytesPos;
+ return b;
+ };
+
+ constructor.prototype.getCode = function flateStreamGetCode(table) {
+ var codes = table[0];
+ var maxLen = table[1];
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+
+ while (codeSize < maxLen) {
+ var b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad encoding in flate stream');
+ codeBuf |= (b << codeSize);
+ codeSize += 8;
+ }
+ var code = codes[codeBuf & ((1 << maxLen) - 1)];
+ var codeLen = code >> 16;
+ var codeVal = code & 0xffff;
+ if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
+ error('Bad encoding in flate stream');
+ this.codeBuf = (codeBuf >> codeLen);
+ this.codeSize = (codeSize - codeLen);
+ this.bytesPos = bytesPos;
+ return codeVal;
+ };
+
+ constructor.prototype.generateHuffmanTable =
+ function flateStreamGenerateHuffmanTable(lengths) {
+ var n = lengths.length;
+
+ // find max code length
+ var maxLen = 0;
+ for (var i = 0; i < n; ++i) {
+ if (lengths[i] > maxLen)
+ maxLen = lengths[i];
+ }
+
+ // build the table
+ var size = 1 << maxLen;
+ var codes = new Uint32Array(size);
+ for (var len = 1, code = 0, skip = 2;
+ len <= maxLen;
+ ++len, code <<= 1, skip <<= 1) {
+ for (var val = 0; val < n; ++val) {
+ if (lengths[val] == len) {
+ // bit-reverse the code
+ var code2 = 0;
+ var t = code;
+ for (var i = 0; i < len; ++i) {
+ code2 = (code2 << 1) | (t & 1);
+ t >>= 1;
+ }
+
+ // fill the table entries
+ for (var i = code2; i < size; i += skip)
+ codes[i] = (len << 16) | val;
+
+ ++code;
+ }
+ }
+ }
+
+ return [codes, maxLen];
+ };
+
+ constructor.prototype.readBlock = function flateStreamReadBlock() {
+ // read block header
+ var hdr = this.getBits(3);
+ if (hdr & 1)
+ this.eof = true;
+ hdr >>= 1;
+
+ if (hdr == 0) { // uncompressed block
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+ var b;
+
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ var blockLen = b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ blockLen |= (b << 8);
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ var check = b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ check |= (b << 8);
+ if (check != (~blockLen & 0xffff))
+ error('Bad uncompressed block length in flate stream');
+
+ this.codeBuf = 0;
+ this.codeSize = 0;
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + blockLen);
+ var end = bufferLength + blockLen;
+ this.bufferLength = end;
+ for (var n = bufferLength; n < end; ++n) {
+ if (typeof (b = bytes[bytesPos++]) == 'undefined') {
+ this.eof = true;
+ break;
+ }
+ buffer[n] = b;
+ }
+ this.bytesPos = bytesPos;
+ return;
+ }
+
+ var litCodeTable;
+ var distCodeTable;
+ if (hdr == 1) { // compressed block, fixed codes
+ litCodeTable = fixedLitCodeTab;
+ distCodeTable = fixedDistCodeTab;
+ } else if (hdr == 2) { // compressed block, dynamic codes
+ var numLitCodes = this.getBits(5) + 257;
+ var numDistCodes = this.getBits(5) + 1;
+ var numCodeLenCodes = this.getBits(4) + 4;
+
+ // build the code lengths code table
+ var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+
+ for (var i = 0; i < numCodeLenCodes; ++i)
+ codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+ var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+ // build the literal and distance code tables
+ var len = 0;
+ var i = 0;
+ var codes = numLitCodes + numDistCodes;
+ var codeLengths = new Uint8Array(codes);
+ while (i < codes) {
+ var code = this.getCode(codeLenCodeTab);
+ if (code == 16) {
+ var bitsLength = 2, bitsOffset = 3, what = len;
+ } else if (code == 17) {
+ var bitsLength = 3, bitsOffset = 3, what = (len = 0);
+ } else if (code == 18) {
+ var bitsLength = 7, bitsOffset = 11, what = (len = 0);
+ } else {
+ codeLengths[i++] = len = code;
+ continue;
+ }
+
+ var repeatLength = this.getBits(bitsLength) + bitsOffset;
+ while (repeatLength-- > 0)
+ codeLengths[i++] = what;
+ }
+
+ litCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+ distCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+ } else {
+ error('Unknown block type in flate stream');
+ }
+
+ var buffer = this.buffer;
+ var limit = buffer ? buffer.length : 0;
+ var pos = this.bufferLength;
+ while (true) {
+ var code1 = this.getCode(litCodeTable);
+ if (code1 < 256) {
+ if (pos + 1 >= limit) {
+ buffer = this.ensureBuffer(pos + 1);
+ limit = buffer.length;
+ }
+ buffer[pos++] = code1;
+ continue;
+ }
+ if (code1 == 256) {
+ this.bufferLength = pos;
+ return;
+ }
+ code1 -= 257;
+ code1 = lengthDecode[code1];
+ var code2 = code1 >> 16;
+ if (code2 > 0)
+ code2 = this.getBits(code2);
+ var len = (code1 & 0xffff) + code2;
+ code1 = this.getCode(distCodeTable);
+ code1 = distDecode[code1];
+ code2 = code1 >> 16;
+ if (code2 > 0)
+ code2 = this.getBits(code2);
+ var dist = (code1 & 0xffff) + code2;
+ if (pos + len >= limit) {
+ buffer = this.ensureBuffer(pos + len);
+ limit = buffer.length;
+ }
+ for (var k = 0; k < len; ++k, ++pos)
+ buffer[pos] = buffer[pos - dist];
+ }
+ };
+
+ return constructor;
+})();
+
+var PredictorStream = (function predictorStream() {
+ function constructor(stream, params) {
+ var predictor = this.predictor = params.get('Predictor') || 1;
+
+ if (predictor <= 1)
+ return stream; // no prediction
+ if (predictor !== 2 && (predictor < 10 || predictor > 15))
+ error('Unsupported predictor: ' + predictor);
+
+ if (predictor === 2)
+ this.readBlock = this.readBlockTiff;
+ else
+ this.readBlock = this.readBlockPng;
+
+ this.stream = stream;
+ this.dict = stream.dict;
+
+ var colors = this.colors = params.get('Colors') || 1;
+ var bits = this.bits = params.get('BitsPerComponent') || 8;
+ var columns = this.columns = params.get('Columns') || 1;
+
+ this.pixBytes = (colors * bits + 7) >> 3;
+ this.rowBytes = (columns * colors * bits + 7) >> 3;
+
+ DecodeStream.call(this);
+ return this;
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlockTiff =
+ function predictorStreamReadBlockTiff() {
+ var rowBytes = this.rowBytes;
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+ var currentRow = buffer.subarray(bufferLength, bufferLength + rowBytes);
+
+ var bits = this.bits;
+ var colors = this.colors;
+
+ var rawBytes = this.stream.getBytes(rowBytes);
+
+ var inbuf = 0, outbuf = 0;
+ var inbits = 0, outbits = 0;
+
+ if (bits === 1) {
+ for (var i = 0; i < rowBytes; ++i) {
+ var c = rawBytes[i];
+ inbuf = (inbuf << 8) | c;
+ // bitwise addition is exclusive or
+ // first shift inbuf and then add
+ currentRow[i] = (c ^ (inbuf >> colors)) & 0xFF;
+ // truncate inbuf (assumes colors < 16)
+ inbuf &= 0xFFFF;
+ }
+ } else if (bits === 8) {
+ for (var i = 0; i < colors; ++i)
+ currentRow[i] = rawBytes[i];
+ for (; i < rowBytes; ++i)
+ currentRow[i] = currentRow[i - colors] + rawBytes[i];
+ } else {
+ var compArray = new Uint8Array(colors + 1);
+ var bitMask = (1 << bits) - 1;
+ var j = 0, k = 0;
+ var columns = this.columns;
+ for (var i = 0; i < columns; ++i) {
+ for (var kk = 0; kk < colors; ++kk) {
+ if (inbits < bits) {
+ inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
+ inbits += 8;
+ }
+ compArray[kk] = (compArray[kk] +
+ (inbuf >> (inbits - bits))) & bitMask;
+ inbits -= bits;
+ outbuf = (outbuf << bits) | compArray[kk];
+ outbits += bits;
+ if (outbits >= 8) {
+ currentRow[k++] = (outbuf >> (outbits - 8)) & 0xFF;
+ outbits -= 8;
+ }
+ }
+ }
+ if (outbits > 0) {
+ currentRow[k++] = (outbuf << (8 - outbits)) +
+ (inbuf & ((1 << (8 - outbits)) - 1));
+ }
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ constructor.prototype.readBlockPng = function predictorStreamReadBlockPng() {
+ var rowBytes = this.rowBytes;
+ var pixBytes = this.pixBytes;
+
+ var predictor = this.stream.getByte();
+ var rawBytes = this.stream.getBytes(rowBytes);
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+ var currentRow = buffer.subarray(bufferLength, bufferLength + rowBytes);
+ var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+ if (prevRow.length == 0)
+ prevRow = new Uint8Array(rowBytes);
+
+ switch (predictor) {
+ case 0:
+ for (var i = 0; i < rowBytes; ++i)
+ currentRow[i] = rawBytes[i];
+ break;
+ case 1:
+ for (var i = 0; i < pixBytes; ++i)
+ currentRow[i] = rawBytes[i];
+ for (; i < rowBytes; ++i)
+ currentRow[i] = (currentRow[i - pixBytes] + rawBytes[i]) & 0xFF;
+ break;
+ case 2:
+ for (var i = 0; i < rowBytes; ++i)
+ currentRow[i] = (prevRow[i] + rawBytes[i]) & 0xFF;
+ break;
+ case 3:
+ for (var i = 0; i < pixBytes; ++i)
+ currentRow[i] = (prevRow[i] >> 1) + rawBytes[i];
+ for (; i < rowBytes; ++i) {
+ currentRow[i] = (((prevRow[i] + currentRow[i - pixBytes]) >> 1) +
+ rawBytes[i]) & 0xFF;
+ }
+ break;
+ case 4:
+ // we need to save the up left pixels values. the simplest way
+ // is to create a new buffer
+ for (var i = 0; i < pixBytes; ++i) {
+ var up = prevRow[i];
+ var c = rawBytes[i];
+ currentRow[i] = up + c;
+ }
+ for (; i < rowBytes; ++i) {
+ var up = prevRow[i];
+ var upLeft = prevRow[i - pixBytes];
+ var left = currentRow[i - pixBytes];
+ var p = left + up - upLeft;
+
+ var pa = p - left;
+ if (pa < 0)
+ pa = -pa;
+ var pb = p - up;
+ if (pb < 0)
+ pb = -pb;
+ var pc = p - upLeft;
+ if (pc < 0)
+ pc = -pc;
+
+ var c = rawBytes[i];
+ if (pa <= pb && pa <= pc)
+ currentRow[i] = left + c;
+ else if (pb <= pc)
+ currentRow[i] = up + c;
+ else
+ currentRow[i] = upLeft + c;
+ }
+ break;
+ default:
+ error('Unsupported predictor: ' + predictor);
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ return constructor;
+})();
+
+/**
+ * Depending on the type of JPEG a JpegStream is handled in different ways. For
+ * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
+ * data is stored and then loaded by the browser. For unsupported JPEG's we use
+ * a library to decode these images and the stream behaves like all the other
+ * DecodeStreams.
+ */
+var JpegStream = (function jpegStream() {
+ function isAdobeImage(bytes) {
+ var maxBytesScanned = Math.max(bytes.length - 16, 1024);
+ // Looking for APP14, 'Adobe'
+ for (var i = 0; i < maxBytesScanned; ++i) {
+ if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
+ bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
+ bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
+ bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
+ bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
+ return true;
+ // scanning until frame tag
+ if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
+ break;
+ }
+ return false;
+ }
+
+ function fixAdobeImage(bytes) {
+ // Inserting 'EMBED' marker after JPEG signature
+ var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
+ 0x44, 0]);
+ var newBytes = new Uint8Array(bytes.length + embedMarker.length);
+ newBytes.set(bytes, embedMarker.length);
+ // copy JPEG header
+ newBytes[0] = bytes[0];
+ newBytes[1] = bytes[1];
+ newBytes.set(embedMarker, 2);
+ return newBytes;
+ }
+
+ function constructor(bytes, dict, xref) {
+ // TODO: per poppler, some images may have 'junk' before that
+ // need to be removed
+ this.dict = dict;
+
+ // Flag indicating wether the image can be natively loaded.
+ this.isNative = true;
+
+ this.colorTransform = -1;
+
+ if (isAdobeImage(bytes)) {
+ // when bug 674619 land, let's check if browser can do
+ // normal cmyk and then we won't have to the following
+ var cs = xref.fetchIfRef(dict.get('ColorSpace'));
+
+ // DeviceRGB and DeviceGray are the only Adobe images that work natively
+ if (isName(cs) && (cs.name === 'DeviceRGB' || cs.name === 'DeviceGray')) {
+ bytes = fixAdobeImage(bytes);
+ this.src = bytesToString(bytes);
+ } else {
+ this.colorTransform = dict.get('ColorTransform');
+ this.isNative = false;
+ this.bytes = bytes;
+ }
+ } else {
+ this.src = bytesToString(bytes);
+ }
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) {
+ if (this.bufferLength)
+ return;
+ var jpegImage = new JpegImage();
+ jpegImage.colorTransform = this.colorTransform;
+ jpegImage.parse(this.bytes);
+ var width = jpegImage.width;
+ var height = jpegImage.height;
+ var data = jpegImage.getData(width, height);
+ this.buffer = data;
+ this.bufferLength = data.length;
+ };
+ constructor.prototype.getIR = function jpegStreamGetIR() {
+ return this.src;
+ };
+ constructor.prototype.getChar = function jpegStreamGetChar() {
+ error('internal error: getChar is not valid on JpegStream');
+ };
+
+ return constructor;
+})();
+
+var DecryptStream = (function decryptStream() {
+ function constructor(str, decrypt) {
+ this.str = str;
+ this.dict = str.dict;
+ this.decrypt = decrypt;
+
+ DecodeStream.call(this);
+ }
+
+ var chunkSize = 512;
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function decryptStreamReadBlock() {
+ var chunk = this.str.getBytes(chunkSize);
+ if (!chunk || chunk.length == 0) {
+ this.eof = true;
+ return;
+ }
+ var decrypt = this.decrypt;
+ chunk = decrypt(chunk);
+
+ var bufferLength = this.bufferLength;
+ var i, n = chunk.length;
+ var buffer = this.ensureBuffer(bufferLength + n);
+ for (i = 0; i < n; i++)
+ buffer[bufferLength++] = chunk[i];
+ this.bufferLength = bufferLength;
+ };
+
+ return constructor;
+})();
+
+var Ascii85Stream = (function ascii85Stream() {
+ function constructor(str) {
+ this.str = str;
+ this.dict = str.dict;
+ this.input = new Uint8Array(5);
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function ascii85StreamReadBlock() {
+ var tildaCode = '~'.charCodeAt(0);
+ var zCode = 'z'.charCodeAt(0);
+ var str = this.str;
+
+ var c = str.getByte();
+ while (Lexer.isSpace(String.fromCharCode(c)))
+ c = str.getByte();
+
+ if (!c || c === tildaCode) {
+ this.eof = true;
+ return;
+ }
+
+ var bufferLength = this.bufferLength, buffer;
+
+ // special code for z
+ if (c == zCode) {
+ buffer = this.ensureBuffer(bufferLength + 4);
+ for (var i = 0; i < 4; ++i)
+ buffer[bufferLength + i] = 0;
+ this.bufferLength += 4;
+ } else {
+ var input = this.input;
+ input[0] = c;
+ for (var i = 1; i < 5; ++i) {
+ c = str.getByte();
+ while (Lexer.isSpace(String.fromCharCode(c)))
+ c = str.getByte();
+
+ input[i] = c;
+
+ if (!c || c == tildaCode)
+ break;
+ }
+ buffer = this.ensureBuffer(bufferLength + i - 1);
+ this.bufferLength += i - 1;
+
+ // partial ending;
+ if (i < 5) {
+ for (; i < 5; ++i)
+ input[i] = 0x21 + 84;
+ this.eof = true;
+ }
+ var t = 0;
+ for (var i = 0; i < 5; ++i)
+ t = t * 85 + (input[i] - 0x21);
+
+ for (var i = 3; i >= 0; --i) {
+ buffer[bufferLength + i] = t & 0xFF;
+ t >>= 8;
+ }
+ }
+ };
+
+ return constructor;
+})();
+
+var AsciiHexStream = (function asciiHexStream() {
+ function constructor(str) {
+ this.str = str;
+ this.dict = str.dict;
+
+ DecodeStream.call(this);
+ }
+
+ var hexvalueMap = {
+ 9: -1, // \t
+ 32: -1, // space
+ 48: 0,
+ 49: 1,
+ 50: 2,
+ 51: 3,
+ 52: 4,
+ 53: 5,
+ 54: 6,
+ 55: 7,
+ 56: 8,
+ 57: 9,
+ 65: 10,
+ 66: 11,
+ 67: 12,
+ 68: 13,
+ 69: 14,
+ 70: 15,
+ 97: 10,
+ 98: 11,
+ 99: 12,
+ 100: 13,
+ 101: 14,
+ 102: 15
+ };
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function asciiHexStreamReadBlock() {
+ var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
+ decodeLength, buffer, bufferLength, i, length;
+
+ decodeLength = (bytes.length + 1) >> 1;
+ buffer = this.ensureBuffer(this.bufferLength + decodeLength);
+ bufferLength = this.bufferLength;
+
+ for (i = 0, length = bytes.length; i < length; i++) {
+ c = hexvalueMap[bytes[i]];
+ while (c == -1 && (i + 1) < length) {
+ c = hexvalueMap[bytes[++i]];
+ }
+
+ if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
+ n = hexvalueMap[bytes[++i]];
+ buffer[bufferLength++] = c * 16 + n;
+ } else {
+ // EOD marker at an odd number, behave as if a 0 followed the last
+ // digit.
+ if (bytes[i] !== gtCode) {
+ buffer[bufferLength++] = c * 16;
+ }
+ }
+ }
+
+ this.bufferLength = bufferLength;
+ this.eof = true;
+ };
+
+ return constructor;
+})();
+
+var CCITTFaxStream = (function ccittFaxStream() {
+
+ var ccittEOL = -2;
+ var twoDimPass = 0;
+ var twoDimHoriz = 1;
+ var twoDimVert0 = 2;
+ var twoDimVertR1 = 3;
+ var twoDimVertL1 = 4;
+ var twoDimVertR2 = 5;
+ var twoDimVertL2 = 6;
+ var twoDimVertR3 = 7;
+ var twoDimVertL3 = 8;
+
+ var twoDimTable = [
+ [-1, -1], [-1, -1], // 000000x
+ [7, twoDimVertL3], // 0000010
+ [7, twoDimVertR3], // 0000011
+ [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
+ [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
+ [4, twoDimPass], [4, twoDimPass], // 0001xxx
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0]
+ ];
+
+ var whiteTable1 = [
+ [-1, -1], // 00000
+ [12, ccittEOL], // 00001
+ [-1, -1], [-1, -1], // 0001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
+ [11, 1792], [11, 1792], // 1000x
+ [12, 1984], // 10010
+ [12, 2048], // 10011
+ [12, 2112], // 10100
+ [12, 2176], // 10101
+ [12, 2240], // 10110
+ [12, 2304], // 10111
+ [11, 1856], [11, 1856], // 1100x
+ [11, 1920], [11, 1920], // 1101x
+ [12, 2368], // 11100
+ [12, 2432], // 11101
+ [12, 2496], // 11110
+ [12, 2560] // 11111
+ ];
+
+ var whiteTable2 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx
+ [8, 29], [8, 29], // 00000010x
+ [8, 30], [8, 30], // 00000011x
+ [8, 45], [8, 45], // 00000100x
+ [8, 46], [8, 46], // 00000101x
+ [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx
+ [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx
+ [8, 47], [8, 47], // 00001010x
+ [8, 48], [8, 48], // 00001011x
+ [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx
+ [6, 13], [6, 13], [6, 13], [6, 13],
+ [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx
+ [8, 33], [8, 33], // 00010010x
+ [8, 34], [8, 34], // 00010011x
+ [8, 35], [8, 35], // 00010100x
+ [8, 36], [8, 36], // 00010101x
+ [8, 37], [8, 37], // 00010110x
+ [8, 38], [8, 38], // 00010111x
+ [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx
+ [8, 31], [8, 31], // 00011010x
+ [8, 32], [8, 32], // 00011011x
+ [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx
+ [6, 1], [6, 1], [6, 1], [6, 1],
+ [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx
+ [6, 12], [6, 12], [6, 12], [6, 12],
+ [8, 53], [8, 53], // 00100100x
+ [8, 54], [8, 54], // 00100101x
+ [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx
+ [8, 39], [8, 39], // 00101000x
+ [8, 40], [8, 40], // 00101001x
+ [8, 41], [8, 41], // 00101010x
+ [8, 42], [8, 42], // 00101011x
+ [8, 43], [8, 43], // 00101100x
+ [8, 44], [8, 44], // 00101101x
+ [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx
+ [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx
+ [8, 61], [8, 61], // 00110010x
+ [8, 62], [8, 62], // 00110011x
+ [8, 63], [8, 63], // 00110100x
+ [8, 0], [8, 0], // 00110101x
+ [8, 320], [8, 320], // 00110110x
+ [8, 384], [8, 384], // 00110111x
+ [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx
+ [8, 59], [8, 59], // 01001010x
+ [8, 60], [8, 60], // 01001011x
+ [9, 1472], // 010011000
+ [9, 1536], // 010011001
+ [9, 1600], // 010011010
+ [9, 1728], // 010011011
+ [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx
+ [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx
+ [8, 49], [8, 49], // 01010010x
+ [8, 50], [8, 50], // 01010011x
+ [8, 51], [8, 51], // 01010100x
+ [8, 52], [8, 52], // 01010101x
+ [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx
+ [8, 55], [8, 55], // 01011000x
+ [8, 56], [8, 56], // 01011001x
+ [8, 57], [8, 57], // 01011010x
+ [8, 58], [8, 58], // 01011011x
+ [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx
+ [6, 192], [6, 192], [6, 192], [6, 192],
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664],
+ [8, 448], [8, 448], // 01100100x
+ [8, 512], [8, 512], // 01100101x
+ [9, 704], // 011001100
+ [9, 768], // 011001101
+ [8, 640], [8, 640], // 01100111x
+ [8, 576], [8, 576], // 01101000x
+ [9, 832], // 011010010
+ [9, 896], // 011010011
+ [9, 960], // 011010100
+ [9, 1024], // 011010101
+ [9, 1088], // 011010110
+ [9, 1152], // 011010111
+ [9, 1216], // 011011000
+ [9, 1280], // 011011001
+ [9, 1344], // 011011010
+ [9, 1408], // 011011011
+ [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx
+ [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx
+ [6, 16], [6, 16], [6, 16], [6, 16],
+ [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx
+ [6, 17], [6, 17], [6, 17], [6, 17],
+ [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx
+ [6, 14], [6, 14], [6, 14], [6, 14],
+ [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx
+ [6, 15], [6, 15], [6, 15], [6, 15],
+ [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7]
+ ];
+
+ var blackTable1 = [
+ [-1, -1], [-1, -1], // 000000000000x
+ [12, ccittEOL], [12, ccittEOL], // 000000000001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx
+ [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
+ [12, 1984], [12, 1984], // 000000010010x
+ [12, 2048], [12, 2048], // 000000010011x
+ [12, 2112], [12, 2112], // 000000010100x
+ [12, 2176], [12, 2176], // 000000010101x
+ [12, 2240], [12, 2240], // 000000010110x
+ [12, 2304], [12, 2304], // 000000010111x
+ [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
+ [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
+ [12, 2368], [12, 2368], // 000000011100x
+ [12, 2432], [12, 2432], // 000000011101x
+ [12, 2496], [12, 2496], // 000000011110x
+ [12, 2560], [12, 2560], // 000000011111x
+ [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx
+ [10, 18], [10, 18], [10, 18], [10, 18],
+ [12, 52], [12, 52], // 000000100100x
+ [13, 640], // 0000001001010
+ [13, 704], // 0000001001011
+ [13, 768], // 0000001001100
+ [13, 832], // 0000001001101
+ [12, 55], [12, 55], // 000000100111x
+ [12, 56], [12, 56], // 000000101000x
+ [13, 1280], // 0000001010010
+ [13, 1344], // 0000001010011
+ [13, 1408], // 0000001010100
+ [13, 1472], // 0000001010101
+ [12, 59], [12, 59], // 000000101011x
+ [12, 60], [12, 60], // 000000101100x
+ [13, 1536], // 0000001011010
+ [13, 1600], // 0000001011011
+ [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx
+ [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx
+ [13, 1664], // 0000001100100
+ [13, 1728], // 0000001100101
+ [12, 320], [12, 320], // 000000110011x
+ [12, 384], [12, 384], // 000000110100x
+ [12, 448], [12, 448], // 000000110101x
+ [13, 512], // 0000001101100
+ [13, 576], // 0000001101101
+ [12, 53], [12, 53], // 000000110111x
+ [12, 54], [12, 54], // 000000111000x
+ [13, 896], // 0000001110010
+ [13, 960], // 0000001110011
+ [13, 1024], // 0000001110100
+ [13, 1088], // 0000001110101
+ [13, 1152], // 0000001110110
+ [13, 1216], // 0000001110111
+ [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx
+ [10, 64], [10, 64], [10, 64], [10, 64]
+ ];
+
+ var blackTable2 = [
+ [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [11, 23], [11, 23], // 00000101000x
+ [12, 50], // 000001010010
+ [12, 51], // 000001010011
+ [12, 44], // 000001010100
+ [12, 45], // 000001010101
+ [12, 46], // 000001010110
+ [12, 47], // 000001010111
+ [12, 57], // 000001011000
+ [12, 58], // 000001011001
+ [12, 61], // 000001011010
+ [12, 256], // 000001011011
+ [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
+ [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
+ [12, 48], // 000001100100
+ [12, 49], // 000001100101
+ [12, 62], // 000001100110
+ [12, 63], // 000001100111
+ [12, 30], // 000001101000
+ [12, 31], // 000001101001
+ [12, 32], // 000001101010
+ [12, 33], // 000001101011
+ [12, 40], // 000001101100
+ [12, 41], // 000001101101
+ [11, 22], [11, 22], // 00000110111x
+ [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx
+ [9, 15], [9, 15], [9, 15], [9, 15],
+ [12, 128], // 000011001000
+ [12, 192], // 000011001001
+ [12, 26], // 000011001010
+ [12, 27], // 000011001011
+ [12, 28], // 000011001100
+ [12, 29], // 000011001101
+ [11, 19], [11, 19], // 00001100111x
+ [11, 20], [11, 20], // 00001101000x
+ [12, 34], // 000011010010
+ [12, 35], // 000011010011
+ [12, 36], // 000011010100
+ [12, 37], // 000011010101
+ [12, 38], // 000011010110
+ [12, 39], // 000011010111
+ [11, 21], [11, 21], // 00001101100x
+ [12, 42], // 000011011010
+ [12, 43], // 000011011011
+ [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx
+ [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12]
+ ];
+
+ var blackTable3 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
+ [6, 9], // 000100
+ [6, 8], // 000101
+ [5, 7], [5, 7], // 00011x
+ [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx
+ [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx
+ [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx
+ [3, 1], [3, 1], [3, 1], [3, 1],
+ [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx
+ [3, 4], [3, 4], [3, 4], [3, 4],
+ [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2]
+ ];
+
+ function constructor(str, params) {
+ this.str = str;
+ this.dict = str.dict;
+
+ params = params || new Dict();
+
+ this.encoding = params.get('K') || 0;
+ this.eoline = params.get('EndOfLine') || false;
+ this.byteAlign = params.get('EncodedByteAlign') || false;
+ this.columns = params.get('Columns') || 1728;
+ this.rows = params.get('Rows') || 0;
+ var eoblock = params.get('EndOfBlock');
+ if (eoblock == null)
+ eoblock = true;
+ this.eoblock = eoblock;
+ this.black = params.get('BlackIs1') || false;
+
+ this.codingLine = new Uint32Array(this.columns + 1);
+ this.refLine = new Uint32Array(this.columns + 2);
+
+ this.codingLine[0] = this.columns;
+ this.codingPos = 0;
+
+ this.row = 0;
+ this.nextLine2D = this.encoding < 0;
+ this.inputBits = 0;
+ this.inputBuf = 0;
+ this.outputBits = 0;
+ this.buf = EOF;
+
+ var code1;
+ while ((code1 = this.lookBits(12)) == 0) {
+ this.eatBits(1);
+ }
+ if (code1 == 1) {
+ this.eatBits(12);
+ }
+ if (this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function ccittFaxStreamReadBlock() {
+ while (!this.eof) {
+ var c = this.lookChar();
+ this.buf = EOF;
+ this.ensureBuffer(this.bufferLength + 1);
+ this.buffer[this.bufferLength++] = c;
+ }
+ };
+
+ constructor.prototype.addPixels =
+ function ccittFaxStreamAddPixels(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ warn('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels) {
+ ++codingPos;
+ }
+
+ codingLine[codingPos] = a1;
+ }
+ this.codingPos = codingPos;
+ };
+
+ constructor.prototype.addPixelsNeg =
+ function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ warn('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels)
+ ++codingPos;
+
+ codingLine[codingPos] = a1;
+ } else if (a1 < codingLine[codingPos]) {
+ if (a1 < 0) {
+ warn('invalid code');
+ this.err = true;
+ a1 = 0;
+ }
+ while (codingPos > 0 && a1 < codingLine[codingPos - 1])
+ --codingPos;
+ codingLine[codingPos] = a1;
+ }
+
+ this.codingPos = codingPos;
+ };
+
+ constructor.prototype.lookChar = function ccittFaxStreamLookChar() {
+ if (this.buf != EOF)
+ return this.buf;
+
+ var refLine = this.refLine;
+ var codingLine = this.codingLine;
+ var columns = this.columns;
+
+ var refPos, blackPixels, bits;
+
+ if (this.outputBits == 0) {
+ if (this.eof)
+ return null;
+
+ this.err = false;
+
+ var code1, code2, code3;
+ if (this.nextLine2D) {
+ for (var i = 0; codingLine[i] < columns; ++i)
+ refLine[i] = codingLine[i];
+
+ refLine[i++] = columns;
+ refLine[i] = columns;
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ refPos = 0;
+ blackPixels = 0;
+
+ while (codingLine[this.codingPos] < columns) {
+ code1 = this.getTwoDimCode();
+ switch (code1) {
+ case twoDimPass:
+ this.addPixels(refLine[refPos + 1], blackPixels);
+ if (refLine[refPos + 1] < columns)
+ refPos += 2;
+ break;
+ case twoDimHoriz:
+ code1 = code2 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] +
+ code1, blackPixels);
+ if (codingLine[this.codingPos] < columns) {
+ this.addPixels(codingLine[this.codingPos] + code2,
+ blackPixels ^ 1);
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ break;
+ case twoDimVertR3:
+ this.addPixels(refLine[refPos] + 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertR2:
+ this.addPixels(refLine[refPos] + 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertR1:
+ this.addPixels(refLine[refPos] + 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVert0:
+ this.addPixels(refLine[refPos], blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL3:
+ this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL2:
+ this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL1:
+ this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case EOF:
+ this.addPixels(columns, 0);
+ this.eof = true;
+ break;
+ default:
+ warn('bad 2d code');
+ this.addPixels(columns, 0);
+ this.err = true;
+ }
+ }
+ } else {
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ blackPixels = 0;
+ while (codingLine[this.codingPos] < columns) {
+ code1 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
+ blackPixels ^= 1;
+ }
+ }
+
+ if (this.byteAlign)
+ this.inputBits &= ~7;
+
+ var gotEOL = false;
+
+ if (!this.eoblock && this.row == this.rows - 1) {
+ this.eof = true;
+ } else {
+ code1 = this.lookBits(12);
+ while (code1 == 0) {
+ this.eatBits(1);
+ code1 = this.lookBits(12);
+ }
+ if (code1 == 1) {
+ this.eatBits(12);
+ gotEOL = true;
+ } else if (code1 == EOF) {
+ this.eof = true;
+ }
+ }
+
+ if (!this.eof && this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ if (this.eoblock && gotEOL) {
+ code1 = this.lookBits(12);
+ if (code1 == 1) {
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ if (this.encoding >= 0) {
+ for (var i = 0; i < 4; ++i) {
+ code1 = this.lookBits(12);
+ if (code1 != 1)
+ warn('bad rtc code: ' + code1);
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ }
+ }
+ this.eof = true;
+ }
+ } else if (this.err && this.eoline) {
+ while (true) {
+ code1 = this.lookBits(13);
+ if (code1 == EOF) {
+ this.eof = true;
+ return null;
+ }
+ if ((code1 >> 1) == 1) {
+ break;
+ }
+ this.eatBits(1);
+ }
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.eatBits(1);
+ this.nextLine2D = !(code1 & 1);
+ }
+ }
+
+ if (codingLine[0] > 0)
+ this.outputBits = codingLine[this.codingPos = 0];
+ else
+ this.outputBits = codingLine[this.codingPos = 1];
+ this.row++;
+ }
+
+ if (this.outputBits >= 8) {
+ this.buf = (this.codingPos & 1) ? 0 : 0xFF;
+ this.outputBits -= 8;
+ if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ }
+ } else {
+ var bits = 8;
+ this.buf = 0;
+ do {
+ if (this.outputBits > bits) {
+ this.buf <<= bits;
+ if (!(this.codingPos & 1)) {
+ this.buf |= 0xFF >> (8 - bits);
+ }
+ this.outputBits -= bits;
+ bits = 0;
+ } else {
+ this.buf <<= this.outputBits;
+ if (!(this.codingPos & 1)) {
+ this.buf |= 0xFF >> (8 - this.outputBits);
+ }
+ bits -= this.outputBits;
+ this.outputBits = 0;
+ if (codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ } else if (bits > 0) {
+ this.buf <<= bits;
+ bits = 0;
+ }
+ }
+ } while (bits);
+ }
+ if (this.black) {
+ this.buf ^= 0xFF;
+ }
+ return this.buf;
+ };
+
+ // This functions returns the code found from the table.
+ // The start and end parameters set the boundaries for searching the table.
+ // The limit parameter is optional. Function returns an array with three
+ // values. The first array element indicates whether a valid code is being
+ // returned. The second array element is the actual code. The third array
+ // element indicates whether EOF was reached.
+ var findTableCode = function ccittFaxStreamFindTableCode(start, end, table,
+ limit) {
+ var limitValue = limit || 0;
+
+ for (var i = start; i <= end; ++i) {
+ var code = this.lookBits(i);
+ if (code == EOF)
+ return [true, 1, false];
+ if (i < end)
+ code <<= end - i;
+ if (!limitValue || code >= limitValue) {
+ var p = table[code - limitValue];
+ if (p[0] == i) {
+ this.eatBits(i);
+ return [true, p[1], true];
+ }
+ }
+ }
+ return [false, 0, false];
+ };
+
+ constructor.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() {
+ var code = 0;
+ var p;
+ if (this.eoblock) {
+ code = this.lookBits(7);
+ p = twoDimTable[code];
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(1, 7, twoDimTable);
+ if (result[0] && result[2])
+ return result[1];
+ }
+ warn('Bad two dim code');
+ return EOF;
+ };
+
+ constructor.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() {
+ var code = 0;
+ var p;
+ var n;
+ if (this.eoblock) {
+ code = this.lookBits(12);
+ if (code == EOF)
+ return 1;
+
+ if ((code >> 5) == 0)
+ p = whiteTable1[code];
+ else
+ p = whiteTable2[code >> 3];
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(1, 9, whiteTable2);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(11, 12, whiteTable1);
+ if (result[0])
+ return result[1];
+ }
+ warn('bad white code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ constructor.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() {
+ var code, p;
+ if (this.eoblock) {
+ code = this.lookBits(13);
+ if (code == EOF)
+ return 1;
+ if ((code >> 7) == 0)
+ p = blackTable1[code];
+ else if ((code >> 9) == 0 && (code >> 7) != 0)
+ p = blackTable2[(code >> 1) - 64];
+ else
+ p = blackTable3[code >> 7];
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(2, 6, blackTable3);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(7, 12, blackTable2, 64);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(10, 13, blackTable1);
+ if (result[0])
+ return result[1];
+ }
+ warn('bad black code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ constructor.prototype.lookBits = function ccittFaxStreamLookBits(n) {
+ var c;
+ while (this.inputBits < n) {
+ if ((c = this.str.getByte()) == null) {
+ if (this.inputBits == 0)
+ return EOF;
+ return ((this.inputBuf << (n - this.inputBits)) &
+ (0xFFFF >> (16 - n)));
+ }
+ this.inputBuf = (this.inputBuf << 8) + c;
+ this.inputBits += 8;
+ }
+ return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
+ };
+
+ constructor.prototype.eatBits = function ccittFaxStreamEatBits(n) {
+ if ((this.inputBits -= n) < 0)
+ this.inputBits = 0;
+ };
+
+ return constructor;
+})();
+
+var LZWStream = (function lzwStream() {
+ function constructor(str, earlyChange) {
+ this.str = str;
+ this.dict = str.dict;
+ this.cachedData = 0;
+ this.bitsCached = 0;
+
+ var maxLzwDictionarySize = 4096;
+ var lzwState = {
+ earlyChange: earlyChange,
+ codeLength: 9,
+ nextCode: 258,
+ dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+ dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+ dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+ currentSequence: new Uint8Array(maxLzwDictionarySize),
+ currentSequenceLength: 0
+ };
+ for (var i = 0; i < 256; ++i) {
+ lzwState.dictionaryValues[i] = i;
+ lzwState.dictionaryLengths[i] = 1;
+ }
+ this.lzwState = lzwState;
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBits = function lzwStreamReadBits(n) {
+ var bitsCached = this.bitsCached;
+ var cachedData = this.cachedData;
+ while (bitsCached < n) {
+ var c = this.str.getByte();
+ if (c == null) {
+ this.eof = true;
+ return null;
+ }
+ cachedData = (cachedData << 8) | c;
+ bitsCached += 8;
+ }
+ this.bitsCached = (bitsCached -= n);
+ this.cachedData = cachedData;
+ this.lastCode = null;
+ return (cachedData >>> bitsCached) & ((1 << n) - 1);
+ };
+
+ constructor.prototype.readBlock = function lzwStreamReadBlock() {
+ var blockSize = 512;
+ var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
+ var i, j, q;
+
+ var lzwState = this.lzwState;
+ if (!lzwState)
+ return; // eof was found
+
+ var earlyChange = lzwState.earlyChange;
+ var nextCode = lzwState.nextCode;
+ var dictionaryValues = lzwState.dictionaryValues;
+ var dictionaryLengths = lzwState.dictionaryLengths;
+ var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+ var codeLength = lzwState.codeLength;
+ var prevCode = lzwState.prevCode;
+ var currentSequence = lzwState.currentSequence;
+ var currentSequenceLength = lzwState.currentSequenceLength;
+
+ var decodedLength = 0;
+ var currentBufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+
+ for (i = 0; i < blockSize; i++) {
+ var code = this.readBits(codeLength);
+ var hasPrev = currentSequenceLength > 0;
+ if (code < 256) {
+ currentSequence[0] = code;
+ currentSequenceLength = 1;
+ } else if (code >= 258) {
+ if (code < nextCode) {
+ currentSequenceLength = dictionaryLengths[code];
+ for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+ currentSequence[j] = dictionaryValues[q];
+ q = dictionaryPrevCodes[q];
+ }
+ } else {
+ currentSequence[currentSequenceLength++] = currentSequence[0];
+ }
+ } else if (code == 256) {
+ codeLength = 9;
+ nextCode = 258;
+ currentSequenceLength = 0;
+ continue;
+ } else {
+ this.eof = true;
+ delete this.lzwState;
+ break;
+ }
+
+ if (hasPrev) {
+ dictionaryPrevCodes[nextCode] = prevCode;
+ dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+ dictionaryValues[nextCode] = currentSequence[0];
+ nextCode++;
+ codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
+ codeLength : Math.min(Math.log(nextCode + earlyChange) /
+ 0.6931471805599453 + 1, 12) | 0;
+ }
+ prevCode = code;
+
+ decodedLength += currentSequenceLength;
+ if (estimatedDecodedSize < decodedLength) {
+ do {
+ estimatedDecodedSize += decodedSizeDelta;
+ } while (estimatedDecodedSize < decodedLength);
+ buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+ }
+ for (j = 0; j < currentSequenceLength; j++)
+ buffer[currentBufferLength++] = currentSequence[j];
+ }
+ lzwState.nextCode = nextCode;
+ lzwState.codeLength = codeLength;
+ lzwState.prevCode = prevCode;
+ lzwState.currentSequenceLength = currentSequenceLength;
+
+ this.bufferLength = currentBufferLength;
+ };
+
+ return constructor;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function MessageHandler(name, comObj) {
+ this.name = name;
+ this.comObj = comObj;
+ var ah = this.actionHandler = {};
+
+ ah['console_log'] = [function ahConsoleLog(data) {
+ console.log.apply(console, data);
+ }];
+ ah['console_error'] = [function ahConsoleError(data) {
+ console.error.apply(console, data);
+ }];
+
+ comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+ var data = event.data;
+ if (data.action in ah) {
+ var action = ah[data.action];
+ action[0].call(action[1], data.data);
+ } else {
+ throw 'Unkown action from worker: ' + data.action;
+ }
+ };
+}
+
+MessageHandler.prototype = {
+ on: function messageHandlerOn(actionName, handler, scope) {
+ var ah = this.actionHandler;
+ if (ah[actionName]) {
+ throw 'There is already an actionName called "' + actionName + '"';
+ }
+ ah[actionName] = [handler, scope];
+ },
+
+ send: function messageHandlerSend(actionName, data) {
+ this.comObj.postMessage({
+ action: actionName,
+ data: data
+ });
+ }
+};
+
+var WorkerMessageHandler = {
+ setup: function wphSetup(handler) {
+ var pdfDoc = null;
+
+ handler.on('test', function wphSetupTest(data) {
+ handler.send('test', data instanceof Uint8Array);
+ });
+
+ handler.on('workerSrc', function wphSetupWorkerSrc(data) {
+ // In development, the `workerSrc` message is handled in the
+ // `worker_loader.js` file. In production the workerProcessHandler is
+ // called for this. This servers as a dummy to prevent calling an
+ // undefined action `workerSrc`.
+ });
+
+ handler.on('doc', function wphSetupDoc(data) {
+ // Create only the model of the PDFDoc, which is enough for
+ // processing the content of the pdf.
+ pdfDoc = new PDFDocModel(new Stream(data));
+ });
+
+ handler.on('page_request', function wphSetupPageRequest(pageNum) {
+ pageNum = parseInt(pageNum);
+
+ var page = pdfDoc.getPage(pageNum);
+
+ // The following code does quite the same as
+ // Page.prototype.startRendering, but stops at one point and sends the
+ // result back to the main thread.
+ var gfx = new CanvasGraphics(null);
+
+ var start = Date.now();
+
+ var dependency = [];
+
+ // Pre compile the pdf page and fetch the fonts/images.
+ var IRQueue = page.getIRQueue(handler, dependency);
+
+ console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum,
+ Date.now() - start, IRQueue.fnArray.length);
+
+ // Filter the dependecies for fonts.
+ var fonts = {};
+ for (var i = 0, ii = dependency.length; i < ii; i++) {
+ var dep = dependency[i];
+ if (dep.indexOf('font_') == 0) {
+ fonts[dep] = true;
+ }
+ }
+
+ handler.send('page', {
+ pageNum: pageNum,
+ IRQueue: IRQueue,
+ depFonts: Object.keys(fonts)
+ });
+ }, this);
+
+ handler.on('font', function wphSetupFont(data) {
+ var objId = data[0];
+ var name = data[1];
+ var file = data[2];
+ var properties = data[3];
+
+ var font = {
+ name: name,
+ file: file,
+ properties: properties
+ };
+
+ // Some fonts don't have a file, e.g. the build in ones like Arial.
+ if (file) {
+ var fontFileDict = new Dict();
+ fontFileDict.map = file.dict.map;
+
+ var fontFile = new Stream(file.bytes, file.start,
+ file.end - file.start, fontFileDict);
+
+ // Check if this is a FlateStream. Otherwise just use the created
+ // Stream one. This makes complex_ttf_font.pdf work.
+ var cmf = file.bytes[0];
+ if ((cmf & 0x0f) == 0x08) {
+ font.file = new FlateStream(fontFile);
+ } else {
+ font.file = fontFile;
+ }
+ }
+
+ var obj = new Font(font.name, font.file, font.properties);
+
+ var str = '';
+ var objData = obj.data;
+ if (objData) {
+ var length = objData.length;
+ for (var j = 0; j < length; ++j)
+ str += String.fromCharCode(objData[j]);
+ }
+
+ obj.str = str;
+
+ // Remove the data array form the font object, as it's not needed
+ // anymore as we sent over the ready str.
+ delete obj.data;
+
+ handler.send('font_ready', [objId, obj]);
+ });
+ }
+};
+
+var consoleTimer = {};
+
+var workerConsole = {
+ log: function log() {
+ var args = Array.prototype.slice.call(arguments);
+ postMessage({
+ action: 'console_log',
+ data: args
+ });
+ },
+
+ error: function error() {
+ var args = Array.prototype.slice.call(arguments);
+ postMessage({
+ action: 'console_error',
+ data: args
+ });
+ },
+
+ time: function time(name) {
+ consoleTimer[name] = Date.now();
+ },
+
+ timeEnd: function timeEnd(name) {
+ var time = consoleTimer[name];
+ if (time == null) {
+ throw 'Unkown timer name ' + name;
+ }
+ this.log('Timer:', name, Date.now() - time);
+ }
+};
+
+// Worker thread?
+if (typeof window === 'undefined') {
+ globalScope.console = workerConsole;
+
+ var handler = new MessageHandler('worker_processor', this);
+ WorkerMessageHandler.setup(handler);
+}
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+// - The JPEG specification can be found in the ITU CCITT Recommendation T.81
+// (www.w3.org/Graphics/JPEG/itu-t81.pdf)
+// - The JFIF specification can be found in the JPEG File Interchange Format
+// (www.w3.org/Graphics/JPEG/jfif3.pdf)
+// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
+// in PostScript Level 2, Technical Note #5116
+// (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
+
+var JpegImage = (function jpegImage() {
+ "use strict";
+ var dctZigZag = new Int32Array([
+ 0,
+ 1, 8,
+ 16, 9, 2,
+ 3, 10, 17, 24,
+ 32, 25, 18, 11, 4,
+ 5, 12, 19, 26, 33, 40,
+ 48, 41, 34, 27, 20, 13, 6,
+ 7, 14, 21, 28, 35, 42, 49, 56,
+ 57, 50, 43, 36, 29, 22, 15,
+ 23, 30, 37, 44, 51, 58,
+ 59, 52, 45, 38, 31,
+ 39, 46, 53, 60,
+ 61, 54, 47,
+ 55, 62,
+ 63
+ ]);
+
+ var dctCos1 = 4017 // cos(pi/16)
+ var dctSin1 = 799 // sin(pi/16)
+ var dctCos3 = 3406 // cos(3*pi/16)
+ var dctSin3 = 2276 // sin(3*pi/16)
+ var dctCos6 = 1567 // cos(6*pi/16)
+ var dctSin6 = 3784 // sin(6*pi/16)
+ var dctSqrt2 = 5793 // sqrt(2)
+ var dctSqrt1d2 = 2896 // sqrt(2) / 2
+
+ function constructor() {
+ }
+
+ function buildHuffmanTable(codeLengths, values) {
+ var k = 0, code = [], i, j, length = 16;
+ while (length > 0 && !codeLengths[length - 1])
+ length--;
+ code.push({children: [], index: 0});
+ var p = code[0], q;
+ for (i = 0; i < length; i++) {
+ for (j = 0; j < codeLengths[i]; j++) {
+ p = code.pop();
+ p.children[p.index] = values[k];
+ while (p.index > 0) {
+ p = code.pop();
+ }
+ p.index++;
+ code.push(p);
+ while (code.length <= i) {
+ code.push(q = {children: [], index: 0});
+ p.children[p.index] = q.children;
+ p = q;
+ }
+ k++;
+ }
+ if (i + 1 < length) {
+ // p here points to last code
+ code.push(q = {children: [], index: 0});
+ p.children[p.index] = q.children;
+ p = q;
+ }
+ }
+ return code[0].children;
+ }
+
+ function decodeScan(data, offset,
+ frame, components, resetInterval,
+ spectralStart, spectralEnd,
+ successivePrev, successive) {
+ var precision = frame.precision;
+ var samplesPerLine = frame.samplesPerLine;
+ var scanLines = frame.scanLines;
+ var mcusPerLine = frame.mcusPerLine;
+ var progressive = frame.progressive;
+ var maxH = frame.maxH, maxV = frame.maxV;
+
+ var startOffset = offset, bitsData = 0, bitsCount = 0;
+ function readBit() {
+ if (bitsCount > 0) {
+ bitsCount--;
+ return (bitsData >> bitsCount) & 1;
+ }
+ bitsData = data[offset++];
+ if (bitsData == 0xFF) {
+ var nextByte = data[offset++];
+ if (nextByte) {
+ throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
+ }
+ // unstuff 0
+ }
+ bitsCount = 7;
+ return bitsData >>> 7;
+ }
+ function decodeHuffman(tree) {
+ var node = tree, bit;
+ while ((bit = readBit()) !== null) {
+ node = node[bit];
+ if (typeof node === 'number')
+ return node;
+ if (typeof node !== 'object')
+ throw "invalid huffman sequence";
+ }
+ return null;
+ }
+ function receive(length) {
+ var n = 0;
+ while (length > 0) {
+ var bit = readBit();
+ if (bit === null) return;
+ n = (n << 1) | bit;
+ length--;
+ }
+ return n;
+ }
+ function receiveAndExtend(length) {
+ var n = receive(length);
+ if (n >= 1 << (length - 1))
+ return n;
+ return n + (-1 << length) + 1;
+ }
+ function decodeBaseline(component, zz) {
+ var t = decodeHuffman(component.huffmanTableDC);
+ var diff = t === 0 ? 0 : receiveAndExtend(t);
+ zz[0]= (component.pred += diff);
+ var k = 1;
+ while (k < 64) {
+ var rs = decodeHuffman(component.huffmanTableAC);
+ var s = rs & 15, r = rs >> 4;
+ if (s === 0) {
+ if (r < 15)
+ break;
+ k += 16;
+ continue;
+ }
+ k += r;
+ var z = dctZigZag[k];
+ zz[z] = receiveAndExtend(s);
+ k++;
+ }
+ }
+ function decodeDCFirst(component, zz) {
+ var t = decodeHuffman(component.huffmanTableDC);
+ var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
+ zz[0] = (component.pred += diff);
+ }
+ function decodeDCSuccessive(component, zz) {
+ zz[0] |= readBit() << successive;
+ }
+ var eobrun = 0;
+ function decodeACFirst(component, zz) {
+ if (eobrun > 0) {
+ eobrun--;
+ return;
+ }
+ var k = spectralStart, e = spectralEnd;
+ while (k <= e) {
+ var rs = decodeHuffman(component.huffmanTableAC);
+ var s = rs & 15, r = rs >> 4;
+ if (s === 0) {
+ if (r < 15) {
+ eobrun = receive(r) + (1 << r) - 1;
+ break;
+ }
+ k += 16;
+ continue;
+ }
+ k += r;
+ var z = dctZigZag[k];
+ zz[z] = receiveAndExtend(s) * (1 << successive);
+ k++;
+ }
+ }
+ var successiveACState = 0, successiveACNextValue;
+ function decodeACSuccessive(component, zz) {
+ var k = spectralStart, e = spectralEnd, r = 0;
+ while (k <= e) {
+ var z = dctZigZag[k];
+ switch (successiveACState) {
+ case 0: // initial state
+ var rs = decodeHuffman(component.huffmanTableAC);
+ var s = rs & 15, r = rs >> 4;
+ if (s === 0) {
+ if (r < 15) {
+ eobrun = receive(r) + (1 << r);
+ successiveACState = 4;
+ } else {
+ r = 16;
+ successiveACState = 1;
+ }
+ } else {
+ if (s !== 1)
+ throw "invalid ACn encoding";
+ successiveACNextValue = receiveAndExtend(s);
+ successiveACState = r ? 2 : 3;
+ }
+ continue;
+ case 1: // skipping r zero items
+ case 2:
+ if (zz[z])
+ zz[z] += (readBit() << successive);
+ else {
+ r--;
+ if (r === 0)
+ successiveACState = successiveACState == 2 ? 3 : 0;
+ }
+ break;
+ case 3: // set value for a zero item
+ if (zz[z])
+ zz[z] += (readBit() << successive);
+ else {
+ zz[z] = successiveACNextValue << successive;
+ successiveACState = 0;
+ }
+ break;
+ case 4: // eob
+ if (zz[z])
+ zz[z] += (readBit() << successive);
+ break;
+ }
+ k++;
+ }
+ if (successiveACState === 4) {
+ eobrun--;
+ if (eobrun === 0)
+ successiveACState = 0;
+ }
+ }
+ function decodeMcu(component, decode, mcu, row, col) {
+ var mcuRow = (mcu / mcusPerLine) | 0;
+ var mcuCol = mcu % mcusPerLine;
+ var blockRow = mcuRow * component.v + row;
+ var blockCol = mcuCol * component.h + col;
+ decode(component, component.blocks[blockRow][blockCol]);
+ }
+ function decodeBlock(component, decode, mcu) {
+ var blockRow = (mcu / component.blocksPerLine) | 0;
+ var blockCol = mcu % component.blocksPerLine;
+ decode(component, component.blocks[blockRow][blockCol]);
+ }
+
+ var componentsLength = components.length;
+ var component, i, j, k, n;
+ var decodeFn;
+ if (progressive) {
+ if (spectralStart === 0)
+ decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+ else
+ decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+ } else {
+ decodeFn = decodeBaseline;
+ }
+
+ var mcu = 0, marker;
+ var mcuExpected;
+ if (componentsLength == 1) {
+ mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+ } else {
+ mcuExpected = mcusPerLine * frame.mcusPerColumn;
+ }
+ if (!resetInterval) resetInterval = mcuExpected;
+
+ var h, v;
+ while (mcu < mcuExpected) {
+ // reset interval stuff
+ for (i = 0; i < componentsLength; i++)
+ components[i].pred = 0;
+ eobrun = 0;
+
+ if (componentsLength == 1) {
+ component = components[0];
+ for (n = 0; n < resetInterval; n++) {
+ decodeBlock(component, decodeFn, mcu);
+ mcu++;
+ }
+ } else {
+ for (n = 0; n < resetInterval; n++) {
+ for (i = 0; i < componentsLength; i++) {
+ component = components[i];
+ h = component.h;
+ v = component.v;
+ for (j = 0; j < v; j++) {
+ for (k = 0; k < h; k++) {
+ decodeMcu(component, decodeFn, mcu, j, k);
+ }
+ }
+ }
+ mcu++;
+ }
+ }
+
+ // find marker
+ bitsCount = 0;
+ marker = (data[offset] << 8) | data[offset + 1];
+ if (marker <= 0xFF00) {
+ throw "marker was not found";
+ }
+
+ if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
+ offset += 2;
+ }
+ else
+ break;
+ }
+
+ return offset - startOffset;
+ }
+
+ function buildComponentData(frame, component) {
+ var lines = [];
+ var blocksPerLine = component.blocksPerLine;
+ var blocksPerColumn = component.blocksPerColumn;
+ var samplesPerLine = blocksPerLine << 3;
+ var R = new Int32Array(64), r = new Uint8Array(64);
+
+ // A port of poppler's IDCT method which in turn is taken from:
+ // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+ // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
+ // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
+ // 988-991.
+ function quantizeAndInverse(zz, dataOut, dataIn) {
+ var qt = component.quantizationTable;
+ var v0, v1, v2, v3, v4, v5, v6, v7, t;
+ var p = dataIn;
+ var i;
+
+ // dequant
+ for (i = 0; i < 64; i++)
+ p[i] = zz[i] * qt[i];
+
+ // inverse DCT on rows
+ for (i = 0; i < 8; ++i) {
+ var row = 8 * i;
+
+ // check for all-zero AC coefficients
+ if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
+ p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
+ p[7 + row] == 0) {
+ t = (dctSqrt2 * p[0 + row] + 512) >> 10;
+ p[0 + row] = t;
+ p[1 + row] = t;
+ p[2 + row] = t;
+ p[3 + row] = t;
+ p[4 + row] = t;
+ p[5 + row] = t;
+ p[6 + row] = t;
+ p[7 + row] = t;
+ continue;
+ }
+
+ // stage 4
+ v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
+ v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
+ v2 = p[2 + row];
+ v3 = p[6 + row];
+ v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
+ v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
+ v5 = p[3 + row] << 4;
+ v6 = p[5 + row] << 4;
+
+ // stage 3
+ t = (v0 - v1+ 1) >> 1;
+ v0 = (v0 + v1 + 1) >> 1;
+ v1 = t;
+ t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
+ v3 = t;
+ t = (v4 - v6 + 1) >> 1;
+ v4 = (v4 + v6 + 1) >> 1;
+ v6 = t;
+ t = (v7 + v5 + 1) >> 1;
+ v5 = (v7 - v5 + 1) >> 1;
+ v7 = t;
+
+ // stage 2
+ t = (v0 - v3 + 1) >> 1;
+ v0 = (v0 + v3 + 1) >> 1;
+ v3 = t;
+ t = (v1 - v2 + 1) >> 1;
+ v1 = (v1 + v2 + 1) >> 1;
+ v2 = t;
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+ v7 = t;
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+ v6 = t;
+
+ // stage 1
+ p[0 + row] = v0 + v7;
+ p[7 + row] = v0 - v7;
+ p[1 + row] = v1 + v6;
+ p[6 + row] = v1 - v6;
+ p[2 + row] = v2 + v5;
+ p[5 + row] = v2 - v5;
+ p[3 + row] = v3 + v4;
+ p[4 + row] = v3 - v4;
+ }
+
+ // inverse DCT on columns
+ for (i = 0; i < 8; ++i) {
+ var col = i;
+
+ // check for all-zero AC coefficients
+ if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
+ p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
+ p[7*8 + col] == 0) {
+ t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
+ p[0*8 + col] = t;
+ p[1*8 + col] = t;
+ p[2*8 + col] = t;
+ p[3*8 + col] = t;
+ p[4*8 + col] = t;
+ p[5*8 + col] = t;
+ p[6*8 + col] = t;
+ p[7*8 + col] = t;
+ continue;
+ }
+
+ // stage 4
+ v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
+ v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
+ v2 = p[2*8 + col];
+ v3 = p[6*8 + col];
+ v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
+ v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
+ v5 = p[3*8 + col];
+ v6 = p[5*8 + col];
+
+ // stage 3
+ t = (v0 - v1 + 1) >> 1;
+ v0 = (v0 + v1 + 1) >> 1;
+ v1 = t;
+ t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
+ v3 = t;
+ t = (v4 - v6 + 1) >> 1;
+ v4 = (v4 + v6 + 1) >> 1;
+ v6 = t;
+ t = (v7 + v5 + 1) >> 1;
+ v5 = (v7 - v5 + 1) >> 1;
+ v7 = t;
+
+ // stage 2
+ t = (v0 - v3 + 1) >> 1;
+ v0 = (v0 + v3 + 1) >> 1;
+ v3 = t;
+ t = (v1 - v2 + 1) >> 1;
+ v1 = (v1 + v2 + 1) >> 1;
+ v2 = t;
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+ v7 = t;
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+ v6 = t;
+
+ // stage 1
+ p[0*8 + col] = v0 + v7;
+ p[7*8 + col] = v0 - v7;
+ p[1*8 + col] = v1 + v6;
+ p[6*8 + col] = v1 - v6;
+ p[2*8 + col] = v2 + v5;
+ p[5*8 + col] = v2 - v5;
+ p[3*8 + col] = v3 + v4;
+ p[4*8 + col] = v3 - v4;
+ }
+
+ // convert to 8-bit integers
+ for (i = 0; i < 64; ++i) {
+ var sample = 128 + ((p[i] + 8) >> 4);
+ dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
+ }
+ }
+
+ var i, j;
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+ var scanLine = blockRow << 3;
+ for (i = 0; i < 8; i++)
+ lines.push(new Uint8Array(samplesPerLine));
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+ quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
+
+ var offset = 0, sample = blockCol << 3;
+ for (j = 0; j < 8; j++) {
+ var line = lines[scanLine + j];
+ for (i = 0; i < 8; i++)
+ line[sample + i] = r[offset++];
+ }
+ }
+ }
+ return lines;
+ }
+
+ constructor.prototype = {
+ load: function load(path) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", path, true);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = (function() {
+ // TODO catch parse error
+ var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+ this.parse(data);
+ if (this.onload)
+ this.onload();
+ }).bind(this);
+ xhr.send(null);
+ },
+ parse: function parse(data) {
+ var offset = 0, length = data.length;
+ function readUint16() {
+ var value = (data[offset] << 8) | data[offset + 1];
+ offset += 2;
+ return value;
+ }
+ function readDataBlock() {
+ var length = readUint16();
+ var array = data.subarray(offset, offset + length - 2);
+ offset += array.length;
+ return array;
+ }
+ function prepareComponents(frame) {
+ var maxH = 0, maxV = 0;
+ var component, componentId;
+ for (componentId in frame.components) {
+ if (frame.components.hasOwnProperty(componentId)) {
+ component = frame.components[componentId];
+ if (maxH < component.h) maxH = component.h;
+ if (maxV < component.v) maxV = component.v;
+ }
+ }
+ var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
+ var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
+ for (componentId in frame.components) {
+ if (frame.components.hasOwnProperty(componentId)) {
+ component = frame.components[componentId];
+ var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
+ var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
+ var blocksPerLineForMcu = mcusPerLine * component.h;
+ var blocksPerColumnForMcu = mcusPerColumn * component.v;
+ var blocks = [];
+ for (var i = 0; i < blocksPerColumnForMcu; i++) {
+ var row = [];
+ for (var j = 0; j < blocksPerLineForMcu; j++)
+ row.push(new Int32Array(64));
+ blocks.push(row);
+ }
+ component.blocksPerLine = blocksPerLine;
+ component.blocksPerColumn = blocksPerColumn;
+ component.blocks = blocks;
+ }
+ }
+ frame.maxH = maxH;
+ frame.maxV = maxV;
+ frame.mcusPerLine = mcusPerLine;
+ frame.mcusPerColumn = mcusPerColumn;
+ }
+ var jfif = null;
+ var adobe = null;
+ var pixels = null;
+ var frame, resetInterval;
+ var quantizationTables = [], frames = [];
+ var huffmanTablesAC = [], huffmanTablesDC = [];
+ var fileMarker = readUint16();
+ if (fileMarker != 0xFFD8) { // SOI (Start of Image)
+ throw "SOI not found";
+ }
+
+ fileMarker = readUint16();
+ while (fileMarker != 0xFFD9) { // EOI (End of image)
+ var i, j, l;
+ switch(fileMarker) {
+ case 0xFFE0: // APP0 (Application Specific)
+ case 0xFFE1: // APP1
+ case 0xFFE2: // APP2
+ case 0xFFE3: // APP3
+ case 0xFFE4: // APP4
+ case 0xFFE5: // APP5
+ case 0xFFE6: // APP6
+ case 0xFFE7: // APP7
+ case 0xFFE8: // APP8
+ case 0xFFE9: // APP9
+ case 0xFFEA: // APP10
+ case 0xFFEB: // APP11
+ case 0xFFEC: // APP12
+ case 0xFFED: // APP13
+ case 0xFFEE: // APP14
+ case 0xFFEF: // APP15
+ case 0xFFFE: // COM (Comment)
+ var appData = readDataBlock();
+
+ if (fileMarker === 0xFFE0) {
+ if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
+ appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
+ jfif = {
+ version: { major: appData[5], minor: appData[6] },
+ densityUnits: appData[7],
+ xDensity: (appData[8] << 8) | appData[9],
+ yDensity: (appData[10] << 8) | appData[11],
+ thumbWidth: appData[12],
+ thumbHeight: appData[13],
+ thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+ };
+ }
+ }
+ // TODO APP1 - Exif
+ if (fileMarker === 0xFFEE) {
+ if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
+ appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
+ adobe = {
+ version: appData[6],
+ flags0: (appData[7] << 8) | appData[8],
+ flags1: (appData[9] << 8) | appData[10],
+ transformCode: appData[11]
+ };
+ }
+ }
+ break;
+
+ case 0xFFDB: // DQT (Define Quantization Tables)
+ var quantizationTableCount = Math.floor((readUint16() - 2) / 65);
+ for (i = 0; i < quantizationTableCount; i++) {
+ var quantizationTableSpec = data[offset++];
+ var tableData = new Int32Array(64);
+ if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
+ for (j = 0; j < 64; j++) {
+ var z = dctZigZag[j];
+ tableData[z] = data[offset++];
+ }
+ } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
+ tableData[j] = readUint16();
+ } else
+ throw "DQT: invalid table spec";
+ quantizationTables[quantizationTableSpec & 15] = tableData;
+ }
+ break;
+
+ case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
+ case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
+ readUint16(); // skip data length
+ frame = {};
+ frame.progressive = (fileMarker === 0xFFC2);
+ frame.precision = data[offset++];
+ frame.scanLines = readUint16();
+ frame.samplesPerLine = readUint16();
+ frame.components = [];
+ var componentsCount = data[offset++], componentId;
+ var maxH = 0, maxV = 0;
+ for (i = 0; i < componentsCount; i++) {
+ componentId = data[offset];
+ var h = data[offset + 1] >> 4;
+ var v = data[offset + 1] & 15;
+ var qId = data[offset + 2];
+ frame.components[componentId] = {
+ h: h,
+ v: v,
+ quantizationTable: quantizationTables[qId]
+ };
+ offset += 3;
+ }
+ prepareComponents(frame);
+ frames.push(frame);
+ break;
+
+ case 0xFFC4: // DHT (Define Huffman Tables)
+ var huffmanLength = readUint16();
+ for (i = 2; i < huffmanLength;) {
+ var huffmanTableSpec = data[offset++];
+ var codeLengths = new Uint8Array(16);
+ var codeLengthSum = 0;
+ for (j = 0; j < 16; j++, offset++)
+ codeLengthSum += (codeLengths[j] = data[offset]);
+ var huffmanValues = new Uint8Array(codeLengthSum);
+ for (j = 0; j < codeLengthSum; j++, offset++)
+ huffmanValues[j] = data[offset];
+ i += 17 + codeLengthSum;
+
+ ((huffmanTableSpec >> 4) === 0 ?
+ huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
+ buildHuffmanTable(codeLengths, huffmanValues);
+ }
+ break;
+
+ case 0xFFDD: // DRI (Define Restart Interval)
+ readUint16(); // skip data length
+ resetInterval = readUint16();
+ break;
+
+ case 0xFFDA: // SOS (Start of Scan)
+ var scanLength = readUint16();
+ var selectorsCount = data[offset++];
+ var components = [], component;
+ for (i = 0; i < selectorsCount; i++) {
+ component = frame.components[data[offset++]];
+ var tableSpec = data[offset++];
+ component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+ component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+ components.push(component);
+ }
+ var spectralStart = data[offset++];
+ var spectralEnd = data[offset++];
+ var successiveApproximation = data[offset++];
+ var processed = decodeScan(data, offset,
+ frame, components, resetInterval,
+ spectralStart, spectralEnd,
+ successiveApproximation >> 4, successiveApproximation & 15);
+ offset += processed;
+ break;
+ default:
+ throw "unknown JPEG marker " + fileMarker.toString(16);
+ }
+ fileMarker = readUint16();
+ }
+ if (frames.length != 1)
+ throw "only single frame JPEGs supported";
+
+ this.width = frame.samplesPerLine;
+ this.height = frame.scanLines;
+ this.jfif = jfif;
+ this.adobe = adobe;
+ this.components = [];
+ for (var id in frame.components) {
+ if (frame.components.hasOwnProperty(id)) {
+ this.components.push({
+ lines: buildComponentData(frame, frame.components[id]),
+ scaleX: frame.components[id].h / frame.maxH,
+ scaleY: frame.components[id].v / frame.maxV
+ });
+ }
+ }
+ },
+ getData: function getData(width, height) {
+ function clampTo8bit(a) {
+ return a < 0 ? 0 : a > 255 ? 255 : a;
+ }
+ var scaleX = this.width / width, scaleY = this.height / height;
+
+ var component1, component2, component3, component4;
+ var component1Line, component2Line, component3Line, component4Line;
+ var x, y;
+ var offset = 0;
+ var Y, Cb, Cr, K, C, M, Ye, R, G, B;
+ var colorTransform;
+ var dataLength = width * height * this.components.length;
+ var data = new Uint8Array(dataLength);
+ switch (this.components.length) {
+ case 1:
+ component1 = this.components[0];
+ for (y = 0; y < height; y++) {
+ component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+ for (x = 0; x < width; x++) {
+ Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+
+ data[offset++] = Y;
+ }
+ }
+ break;
+ case 3:
+ // The default transform for three components is true
+ colorTransform = true;
+ // The adobe transform marker overrides any previous setting
+ if (this.adobe && this.adobe.transformCode)
+ colorTransform = true;
+ else if (typeof this.colorTransform !== 'undefined')
+ colorTransform = !!this.colorTransform;
+
+ component1 = this.components[0];
+ component2 = this.components[1];
+ component3 = this.components[2];
+ for (y = 0; y < height; y++) {
+ component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+ component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
+ component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
+ for (x = 0; x < width; x++) {
+ if (!colorTransform) {
+ R = component1Line[0 | (x * component1.scaleX * scaleX)];
+ G = component2Line[0 | (x * component2.scaleX * scaleX)];
+ B = component3Line[0 | (x * component3.scaleX * scaleX)];
+ } else {
+ Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+ Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
+ Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
+
+ R = clampTo8bit(Y + 1.402 * (Cr - 128));
+ G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+ B = clampTo8bit(Y + 1.772 * (Cb - 128));
+ }
+
+ data[offset++] = R;
+ data[offset++] = G;
+ data[offset++] = B;
+ }
+ }
+ break;
+ case 4:
+ if (!this.adobe)
+ throw 'Unsupported color mode (4 components)';
+ // The default transform for four components is false
+ colorTransform = false;
+ // The adobe transform marker overrides any previous setting
+ if (this.adobe && this.adobe.transformCode)
+ colorTransform = true;
+ else if (typeof this.colorTransform !== 'undefined')
+ colorTransform = !!this.colorTransform;
+
+ component1 = this.components[0];
+ component2 = this.components[1];
+ component3 = this.components[2];
+ component4 = this.components[3];
+ for (y = 0; y < height; y++) {
+ component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+ component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
+ component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
+ component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
+ for (x = 0; x < width; x++) {
+ if (!colorTransform) {
+ C = component1Line[0 | (x * component1.scaleX * scaleX)];
+ M = component2Line[0 | (x * component2.scaleX * scaleX)];
+ Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
+ K = component4Line[0 | (x * component4.scaleX * scaleX)];
+ } else {
+ Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+ Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
+ Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
+ K = component4Line[0 | (x * component4.scaleX * scaleX)];
+
+ C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
+ M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+ Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
+ }
+ data[offset++] = C;
+ data[offset++] = M;
+ data[offset++] = Ye;
+ data[offset++] = K;
+ }
+ }
+ break;
+ default:
+ throw 'Unsupported color mode';
+ }
+ return data;
+ },
+ copyToImageData: function copyToImageData(imageData) {
+ var width = imageData.width, height = imageData.height;
+ var imageDataArray = imageData.data;
+ var data = this.getData(width, height);
+ var i = 0, j = 0, x, y;
+ var Y, K, C, M, R, G, B;
+ switch (this.components.length) {
+ case 1:
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++) {
+ Y = data[i++];
+
+ imageDataArray[j++] = Y;
+ imageDataArray[j++] = Y;
+ imageDataArray[j++] = Y;
+ imageDataArray[j++] = 255;
+ }
+ }
+ break;
+ case 3:
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++) {
+ R = data[i++];
+ G = data[i++];
+ B = data[i++];
+
+ imageDataArray[j++] = R;
+ imageDataArray[j++] = G;
+ imageDataArray[j++] = B;
+ imageDataArray[j++] = 255;
+ }
+ }
+ break;
+ case 4:
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++) {
+ C = data[i++];
+ M = data[i++];
+ Y = data[i++];
+ K = data[i++];
+
+ R = 255 - clampTo8bit(C * (1 - K / 255) + K);
+ G = 255 - clampTo8bit(M * (1 - K / 255) + K);
+ B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
+
+ imageDataArray[j++] = R;
+ imageDataArray[j++] = G;
+ imageDataArray[j++] = B;
+ imageDataArray[j++] = 255;
+ }
+ }
+ break;
+ default:
+ throw 'Unsupported color mode';
+ }
+ }
+ };
+
+ return constructor;
+})();
+}).call((typeof window === 'undefined') ? this : window);
diff --git a/apps/files_pdfviewer/js/pdfjs/src/canvas.js b/apps/files_pdfviewer/js/pdfjs/src/canvas.js
new file mode 100755
index 00000000000..9b3ed0ba9ad
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/canvas.js
@@ -0,0 +1,869 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+// <canvas> contexts store most of the state we need natively.
+// However, PDF needs a bit more state, which we store here.
+
+var CanvasExtraState = (function canvasExtraState() {
+ function constructor(old) {
+ // Are soft masks and alpha values shapes or opacities?
+ this.alphaIsShape = false;
+ this.fontSize = 0;
+ this.textMatrix = IDENTITY_MATRIX;
+ this.leading = 0;
+ // Current point (in user coordinates)
+ this.x = 0;
+ this.y = 0;
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ // Color spaces
+ this.fillColorSpace = new DeviceGrayCS();
+ this.fillColorSpaceObj = null;
+ this.strokeColorSpace = new DeviceGrayCS();
+ this.strokeColorSpaceObj = null;
+ this.fillColorObj = null;
+ this.strokeColorObj = null;
+ // Default fore and background colors
+ this.fillColor = '#000000';
+ this.strokeColor = '#000000';
+ // Note: fill alpha applies to all non-stroking operations
+ this.fillAlpha = 1;
+ this.strokeAlpha = 1;
+
+ this.old = old;
+ }
+
+ constructor.prototype = {
+ clone: function canvasextra_clone() {
+ return Object.create(this);
+ },
+ setCurrentPoint: function canvasextra_setCurrentPoint(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ };
+ return constructor;
+})();
+
+function ScratchCanvas(width, height) {
+ var canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ return canvas;
+}
+
+var CanvasGraphics = (function canvasGraphics() {
+ // Defines the time the executeIRQueue is going to be executing
+ // before it stops and shedules a continue of execution.
+ var kExecutionTime = 50;
+
+ // Number of IR commands to execute before checking
+ // if we execute longer then `kExecutionTime`.
+ var kExecutionTimeCheck = 500;
+
+ function constructor(canvasCtx, objs) {
+ this.ctx = canvasCtx;
+ this.current = new CanvasExtraState();
+ this.stateStack = [];
+ this.pendingClip = null;
+ this.res = null;
+ this.xobjs = null;
+ this.ScratchCanvas = ScratchCanvas;
+ this.objs = objs;
+ }
+
+ var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+ var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+ var NORMAL_CLIP = {};
+ var EO_CLIP = {};
+
+ constructor.prototype = {
+ beginDrawing: function canvasGraphicsBeginDrawing(mediaBox) {
+ var cw = this.ctx.canvas.width, ch = this.ctx.canvas.height;
+ this.ctx.save();
+ switch (mediaBox.rotate) {
+ case 0:
+ this.ctx.transform(1, 0, 0, -1, 0, ch);
+ break;
+ case 90:
+ this.ctx.transform(0, 1, 1, 0, 0, 0);
+ break;
+ case 180:
+ this.ctx.transform(-1, 0, 0, 1, cw, 0);
+ break;
+ case 270:
+ this.ctx.transform(0, -1, -1, 0, cw, ch);
+ break;
+ }
+ this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height);
+ },
+
+ executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR,
+ executionStartIdx, continueCallback) {
+ var argsArray = codeIR.argsArray;
+ var fnArray = codeIR.fnArray;
+ var i = executionStartIdx || 0;
+ var argsArrayLen = argsArray.length;
+
+ var executionEndIdx;
+ var startTime = Date.now();
+
+ var objs = this.objs;
+
+ do {
+ executionEndIdx = Math.min(argsArrayLen, i + kExecutionTimeCheck);
+
+ for (i; i < executionEndIdx; i++) {
+ if (fnArray[i] !== 'dependency') {
+ this[fnArray[i]].apply(this, argsArray[i]);
+ } else {
+ var deps = argsArray[i];
+ for (var n = 0, nn = deps.length; n < nn; n++) {
+ var depObjId = deps[n];
+
+ // If the promise isn't resolved yet, add the continueCallback
+ // to the promise and bail out.
+ if (!objs.isResolved(depObjId)) {
+ objs.get(depObjId, continueCallback);
+ return i;
+ }
+ }
+ }
+ }
+
+ // If the entire IRQueue was executed, stop as were done.
+ if (i == argsArrayLen) {
+ return i;
+ }
+
+ // If the execution took longer then a certain amount of time, shedule
+ // to continue exeution after a short delay.
+ // However, this is only possible if a 'continueCallback' is passed in.
+ if (continueCallback && (Date.now() - startTime) > kExecutionTime) {
+ setTimeout(continueCallback, 0);
+ return i;
+ }
+
+ // If the IRQueue isn't executed completly yet OR the execution time
+ // was short enough, do another execution round.
+ } while (true);
+ },
+
+ endDrawing: function canvasGraphicsEndDrawing() {
+ this.ctx.restore();
+ },
+
+ // Graphics state
+ setLineWidth: function canvasGraphicsSetLineWidth(width) {
+ this.ctx.lineWidth = width;
+ },
+ setLineCap: function canvasGraphicsSetLineCap(style) {
+ this.ctx.lineCap = LINE_CAP_STYLES[style];
+ },
+ setLineJoin: function canvasGraphicsSetLineJoin(style) {
+ this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+ },
+ setMiterLimit: function canvasGraphicsSetMiterLimit(limit) {
+ this.ctx.miterLimit = limit;
+ },
+ setDash: function canvasGraphicsSetDash(dashArray, dashPhase) {
+ this.ctx.mozDash = dashArray;
+ this.ctx.mozDashOffset = dashPhase;
+ },
+ setRenderingIntent: function canvasGraphicsSetRenderingIntent(intent) {
+ TODO('set rendering intent: ' + intent);
+ },
+ setFlatness: function canvasGraphicsSetFlatness(flatness) {
+ TODO('set flatness: ' + flatness);
+ },
+ setGState: function canvasGraphicsSetGState(states) {
+ for (var i = 0, ii = states.length; i < ii; i++) {
+ var state = states[i];
+ var key = state[0];
+ var value = state[1];
+
+ switch (key) {
+ case 'LW':
+ this.setLineWidth(value);
+ break;
+ case 'LC':
+ this.setLineCap(value);
+ break;
+ case 'LJ':
+ this.setLineJoin(value);
+ break;
+ case 'ML':
+ this.setMiterLimit(value);
+ break;
+ case 'D':
+ this.setDash(value[0], value[1]);
+ break;
+ case 'RI':
+ this.setRenderingIntent(value);
+ break;
+ case 'FL':
+ this.setFlatness(value);
+ break;
+ case 'Font':
+ this.setFont(state[1], state[2]);
+ break;
+ case 'CA':
+ this.current.strokeAlpha = state[1];
+ break;
+ case 'ca':
+ this.current.fillAlpha = state[1];
+ this.ctx.globalAlpha = state[1];
+ break;
+ }
+ }
+ },
+ save: function canvasGraphicsSave() {
+ this.ctx.save();
+ var old = this.current;
+ this.stateStack.push(old);
+ this.current = old.clone();
+ },
+ restore: function canvasGraphicsRestore() {
+ var prev = this.stateStack.pop();
+ if (prev) {
+ this.current = prev;
+ this.ctx.restore();
+ }
+ },
+ transform: function canvasGraphicsTransform(a, b, c, d, e, f) {
+ this.ctx.transform(a, b, c, d, e, f);
+ },
+
+ // Path
+ moveTo: function canvasGraphicsMoveTo(x, y) {
+ this.ctx.moveTo(x, y);
+ this.current.setCurrentPoint(x, y);
+ },
+ lineTo: function canvasGraphicsLineTo(x, y) {
+ this.ctx.lineTo(x, y);
+ this.current.setCurrentPoint(x, y);
+ },
+ curveTo: function canvasGraphicsCurveTo(x1, y1, x2, y2, x3, y3) {
+ this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
+ this.current.setCurrentPoint(x3, y3);
+ },
+ curveTo2: function canvasGraphicsCurveTo2(x2, y2, x3, y3) {
+ var current = this.current;
+ this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
+ current.setCurrentPoint(x3, y3);
+ },
+ curveTo3: function canvasGraphicsCurveTo3(x1, y1, x3, y3) {
+ this.curveTo(x1, y1, x3, y3, x3, y3);
+ this.current.setCurrentPoint(x3, y3);
+ },
+ closePath: function canvasGraphicsClosePath() {
+ this.ctx.closePath();
+ },
+ rectangle: function canvasGraphicsRectangle(x, y, width, height) {
+ this.ctx.rect(x, y, width, height);
+ },
+ stroke: function canvasGraphicsStroke(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var strokeColor = this.current.strokeColor;
+ // For stroke we want to temporarily change the global alpha to the
+ // stroking alpha.
+ ctx.globalAlpha = this.current.strokeAlpha;
+ if (strokeColor && strokeColor.hasOwnProperty('type') &&
+ strokeColor.type === 'Pattern') {
+ // for patterns, we transform to pattern space, calculate
+ // the pattern, call stroke, and restore to user space
+ ctx.save();
+ ctx.strokeStyle = strokeColor.getPattern(ctx);
+ ctx.stroke();
+ ctx.restore();
+ } else {
+ ctx.stroke();
+ }
+ if (consumePath)
+ this.consumePath();
+ // Restore the global alpha to the fill alpha
+ ctx.globalAlpha = this.current.fillAlpha;
+ },
+ closeStroke: function canvasGraphicsCloseStroke() {
+ this.closePath();
+ this.stroke();
+ },
+ fill: function canvasGraphicsFill(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var fillColor = this.current.fillColor;
+
+ if (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') {
+ ctx.save();
+ ctx.fillStyle = fillColor.getPattern(ctx);
+ ctx.fill();
+ ctx.restore();
+ } else {
+ ctx.fill();
+ }
+ if (consumePath)
+ this.consumePath();
+ },
+ eoFill: function canvasGraphicsEoFill() {
+ var savedFillRule = this.setEOFillRule();
+ this.fill();
+ this.restoreFillRule(savedFillRule);
+ },
+ fillStroke: function canvasGraphicsFillStroke() {
+ this.fill(false);
+ this.stroke(false);
+
+ this.consumePath();
+ },
+ eoFillStroke: function canvasGraphicsEoFillStroke() {
+ var savedFillRule = this.setEOFillRule();
+ this.fillStroke();
+ this.restoreFillRule(savedFillRule);
+ },
+ closeFillStroke: function canvasGraphicsCloseFillStroke() {
+ this.closePath();
+ this.fillStroke();
+ },
+ closeEOFillStroke: function canvasGraphicsCloseEOFillStroke() {
+ var savedFillRule = this.setEOFillRule();
+ this.closePath();
+ this.fillStroke();
+ this.restoreFillRule(savedFillRule);
+ },
+ endPath: function canvasGraphicsEndPath() {
+ this.consumePath();
+ },
+
+ // Clipping
+ clip: function canvasGraphicsClip() {
+ this.pendingClip = NORMAL_CLIP;
+ },
+ eoClip: function canvasGraphicsEoClip() {
+ this.pendingClip = EO_CLIP;
+ },
+
+ // Text
+ beginText: function canvasGraphicsBeginText() {
+ this.current.textMatrix = IDENTITY_MATRIX;
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ endText: function canvasGraphicsEndText() {
+ },
+ setCharSpacing: function canvasGraphicsSetCharSpacing(spacing) {
+ this.current.charSpacing = spacing;
+ },
+ setWordSpacing: function canvasGraphicsSetWordSpacing(spacing) {
+ this.current.wordSpacing = spacing;
+ },
+ setHScale: function canvasGraphicsSetHScale(scale) {
+ this.current.textHScale = scale / 100;
+ },
+ setLeading: function canvasGraphicsSetLeading(leading) {
+ this.current.leading = -leading;
+ },
+ setFont: function canvasGraphicsSetFont(fontRefName, size) {
+ var fontObj = this.objs.get(fontRefName).fontObj;
+
+ if (!fontObj) {
+ throw 'Can\'t find font for ' + fontRefName;
+ }
+
+ var name = fontObj.loadedName || 'sans-serif';
+
+ this.current.font = fontObj;
+ this.current.fontSize = size;
+
+ var name = fontObj.loadedName || 'sans-serif';
+ var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+ (fontObj.bold ? 'bold' : 'normal');
+
+ var italic = fontObj.italic ? 'italic' : 'normal';
+ var serif = fontObj.serif ? 'serif' : 'sans-serif';
+ var typeface = '"' + name + '", ' + serif;
+ var rule = italic + ' ' + bold + ' ' + size + 'px ' + typeface;
+ this.ctx.font = rule;
+ },
+ setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) {
+ TODO('text rendering mode: ' + mode);
+ },
+ setTextRise: function canvasGraphicsSetTextRise(rise) {
+ TODO('text rise: ' + rise);
+ },
+ moveText: function canvasGraphicsMoveText(x, y) {
+ this.current.x = this.current.lineX += x;
+ this.current.y = this.current.lineY += y;
+ },
+ setLeadingMoveText: function canvasGraphicsSetLeadingMoveText(x, y) {
+ this.setLeading(-y);
+ this.moveText(x, y);
+ },
+ setTextMatrix: function canvasGraphicsSetTextMatrix(a, b, c, d, e, f) {
+ this.current.textMatrix = [a, b, c, d, e, f];
+
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ nextLine: function canvasGraphicsNextLine() {
+ this.moveText(0, this.current.leading);
+ },
+ showText: function canvasGraphicsShowText(text) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var font = current.font;
+ var glyphs = font.charsToGlyphs(text);
+ var fontSize = current.fontSize;
+ var charSpacing = current.charSpacing;
+ var wordSpacing = current.wordSpacing;
+ var textHScale = current.textHScale;
+ var glyphsLength = glyphs.length;
+ if (font.coded) {
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.translate(current.x, current.y);
+
+ var fontMatrix = font.fontMatrix || IDENTITY_MATRIX;
+ ctx.scale(1 / textHScale, 1);
+ for (var i = 0; i < glyphsLength; ++i) {
+
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ this.ctx.translate(wordSpacing, 0);
+ continue;
+ }
+
+ this.save();
+ ctx.scale(fontSize, fontSize);
+ ctx.transform.apply(ctx, fontMatrix);
+ this.executeIRQueue(glyph.codeIRQueue);
+ this.restore();
+
+ var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
+ var width = transformed[0] * fontSize + charSpacing;
+
+ ctx.translate(width, 0);
+ current.x += width;
+
+ }
+ ctx.restore();
+ } else {
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.scale(1, -1);
+ ctx.translate(current.x, -1 * current.y);
+ ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX);
+
+ ctx.scale(1 / textHScale, 1);
+
+ var width = 0;
+ for (var i = 0; i < glyphsLength; ++i) {
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ width += wordSpacing;
+ continue;
+ }
+
+ var unicode = glyph.unicode;
+ var char = (unicode >= 0x10000) ?
+ String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10),
+ 0xDC00 | (unicode & 0x3FF)) : String.fromCharCode(unicode);
+
+ ctx.fillText(char, width, 0);
+ width += glyph.width * fontSize * 0.001 + charSpacing;
+ }
+ current.x += width;
+
+ ctx.restore();
+ }
+ },
+
+ showSpacedText: function canvasGraphicsShowSpacedText(arr) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var fontSize = current.fontSize;
+ var textHScale = current.textHScale;
+ var arrLength = arr.length;
+ for (var i = 0; i < arrLength; ++i) {
+ var e = arr[i];
+ if (isNum(e)) {
+ current.x -= e * 0.001 * fontSize * textHScale;
+ } else if (isString(e)) {
+ this.showText(e);
+ } else {
+ malformed('TJ array element ' + e + ' is not string or num');
+ }
+ }
+ },
+ nextLineShowText: function canvasGraphicsNextLineShowText(text) {
+ this.nextLine();
+ this.showText(text);
+ },
+ nextLineSetSpacingShowText:
+ function canvasGraphicsNextLineSetSpacingShowText(wordSpacing,
+ charSpacing,
+ text) {
+ this.setWordSpacing(wordSpacing);
+ this.setCharSpacing(charSpacing);
+ this.nextLineShowText(text);
+ },
+
+ // Type3 fonts
+ setCharWidth: function canvasGraphicsSetCharWidth(xWidth, yWidth) {
+ // We can safely ignore this since the width should be the same
+ // as the width in the Widths array.
+ },
+ setCharWidthAndBounds: function canvasGraphicsSetCharWidthAndBounds(xWidth,
+ yWidth,
+ llx,
+ lly,
+ urx,
+ ury) {
+ // TODO According to the spec we're also suppose to ignore any operators
+ // that set color or include images while processing this type3 font.
+ this.rectangle(llx, lly, urx - llx, ury - lly);
+ this.clip();
+ this.endPath();
+ },
+
+ // Color
+ setStrokeColorSpace: function canvasGraphicsSetStrokeColorSpace(raw) {
+ this.current.strokeColorSpace = ColorSpace.fromIR(raw);
+ },
+ setFillColorSpace: function canvasGraphicsSetFillColorSpace(raw) {
+ this.current.fillColorSpace = ColorSpace.fromIR(raw);
+ },
+ setStrokeColor: function canvasGraphicsSetStrokeColor(/*...*/) {
+ var cs = this.current.strokeColorSpace;
+ var color = cs.getRgb(arguments);
+ var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ getColorN_IR_Pattern: function canvasGraphicsGetColorN_IR_Pattern(IR, cs) {
+ if (IR[0] == 'TilingPattern') {
+ var args = IR[1];
+ var base = cs.base;
+ var color;
+ if (base) {
+ var baseComps = base.numComps;
+
+ color = [];
+ for (var i = 0; i < baseComps; ++i)
+ color.push(args[i]);
+
+ color = base.getRgb(color);
+ }
+ var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
+ } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
+ var pattern = Pattern.shadingFromIR(this.ctx, IR);
+ } else {
+ throw 'Unkown IR type';
+ }
+ return pattern;
+ },
+ setStrokeColorN_IR: function canvasGraphicsSetStrokeColorN(/*...*/) {
+ var cs = this.current.strokeColorSpace;
+
+ if (cs.name == 'Pattern') {
+ this.current.strokeColor = this.getColorN_IR_Pattern(arguments, cs);
+ } else {
+ this.setStrokeColor.apply(this, arguments);
+ }
+ },
+ setFillColor: function canvasGraphicsSetFillColor(/*...*/) {
+ var cs = this.current.fillColorSpace;
+ var color = Util.makeCssRgb.apply(null, cs.getRgb(arguments));
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setFillColorN_IR: function canvasGraphicsSetFillColorN(/*...*/) {
+ var cs = this.current.fillColorSpace;
+
+ if (cs.name == 'Pattern') {
+ this.current.fillColor = this.getColorN_IR_Pattern(arguments, cs);
+ } else {
+ this.setFillColor.apply(this, arguments);
+ }
+ },
+ setStrokeGray: function canvasGraphicsSetStrokeGray(gray) {
+ if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
+ this.current.strokeColorSpace = new DeviceGrayCS();
+
+ var color = Util.makeCssRgb(gray, gray, gray);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillGray: function canvasGraphicsSetFillGray(gray) {
+ if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
+ this.current.fillColorSpace = new DeviceGrayCS();
+
+ var color = Util.makeCssRgb(gray, gray, gray);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setStrokeRGBColor: function canvasGraphicsSetStrokeRGBColor(r, g, b) {
+ if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
+ this.current.strokeColorSpace = new DeviceRgbCS();
+
+ var color = Util.makeCssRgb(r, g, b);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillRGBColor: function canvasGraphicsSetFillRGBColor(r, g, b) {
+ if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
+ this.current.fillColorSpace = new DeviceRgbCS();
+
+ var color = Util.makeCssRgb(r, g, b);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+ setStrokeCMYKColor: function canvasGraphicsSetStrokeCMYKColor(c, m, y, k) {
+ if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
+ this.current.strokeColorSpace = new DeviceCmykCS();
+
+ var color = Util.makeCssCmyk(c, m, y, k);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillCMYKColor: function canvasGraphicsSetFillCMYKColor(c, m, y, k) {
+ if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
+ this.current.fillColorSpace = new DeviceCmykCS();
+
+ var color = Util.makeCssCmyk(c, m, y, k);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+
+ shadingFill: function canvasGraphicsShadingFill(patternIR) {
+ var ctx = this.ctx;
+
+ this.save();
+ ctx.fillStyle = Pattern.shadingFromIR(ctx, patternIR);
+
+ var inv = ctx.mozCurrentTransformInverse;
+ if (inv) {
+ var canvas = ctx.canvas;
+ var width = canvas.width;
+ var height = canvas.height;
+
+ var bl = Util.applyTransform([0, 0], inv);
+ var br = Util.applyTransform([0, width], inv);
+ var ul = Util.applyTransform([height, 0], inv);
+ var ur = Util.applyTransform([height, width], inv);
+
+ var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+ var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+ var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+ var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+
+ this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+ } else {
+ // HACK to draw the gradient onto an infinite rectangle.
+ // PDF gradients are drawn across the entire image while
+ // Canvas only allows gradients to be drawn in a rectangle
+ // The following bug should allow us to remove this.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
+
+ this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+ }
+
+ this.restore();
+ },
+
+ // Images
+ beginInlineImage: function canvasGraphicsBeginInlineImage() {
+ error('Should not call beginInlineImage');
+ },
+ beginImageData: function canvasGraphicsBeginImageData() {
+ error('Should not call beginImageData');
+ },
+
+ paintFormXObjectBegin: function canvasGraphicsPaintFormXObjectBegin(matrix,
+ bbox) {
+ this.save();
+
+ if (matrix && isArray(matrix) && 6 == matrix.length)
+ this.transform.apply(this, matrix);
+
+ if (bbox && isArray(bbox) && 4 == bbox.length) {
+ var width = bbox[2] - bbox[0];
+ var height = bbox[3] - bbox[1];
+ this.rectangle(bbox[0], bbox[1], width, height);
+ this.clip();
+ this.endPath();
+ }
+ },
+
+ paintFormXObjectEnd: function canvasGraphicsPaintFormXObjectEnd() {
+ this.restore();
+ },
+
+ paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
+ var image = this.objs.get(objId);
+ if (!image) {
+ error('Dependent image isn\'t ready yet');
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var domImage = image.getImage();
+ ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, -h, w, h);
+
+ this.restore();
+ },
+
+ paintImageMaskXObject: function canvasGraphicsPaintImageMaskXObject(
+ imgArray, inverseDecode, width, height) {
+ function applyStencilMask(buffer, inverseDecode) {
+ var imgArrayPos = 0;
+ var i, j, mask, buf;
+ // removing making non-masked pixels transparent
+ var bufferPos = 3; // alpha component offset
+ for (i = 0; i < height; i++) {
+ mask = 0;
+ for (j = 0; j < width; j++) {
+ if (!mask) {
+ buf = imgArray[imgArrayPos++];
+ mask = 128;
+ }
+ if (!(buf & mask) == inverseDecode) {
+ buffer[bufferPos] = 0;
+ }
+ bufferPos += 4;
+ mask >>= 1;
+ }
+ }
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ var w = width, h = height;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var tmpCanvas = new this.ScratchCanvas(w, h);
+ var tmpCtx = tmpCanvas.getContext('2d');
+
+ var fillColor = this.current.fillColor;
+ tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') ?
+ fillColor.getPattern(tmpCtx) : fillColor;
+ tmpCtx.fillRect(0, 0, w, h);
+
+ var imgData = tmpCtx.getImageData(0, 0, w, h);
+ var pixels = imgData.data;
+
+ applyStencilMask(pixels, inverseDecode);
+
+ tmpCtx.putImageData(imgData, 0, 0);
+ ctx.drawImage(tmpCanvas, 0, -h);
+ this.restore();
+ },
+
+ paintImageXObject: function canvasGraphicsPaintImageXObject(imgData) {
+ this.save();
+ var ctx = this.ctx;
+ var w = imgData.width;
+ var h = imgData.height;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ var tmpCanvas = new this.ScratchCanvas(w, h);
+ var tmpCtx = tmpCanvas.getContext('2d');
+ var tmpImgData;
+
+ // Some browsers can set an UInt8Array directly as imageData, some
+ // can't. As long as we don't have proper feature detection, just
+ // copy over each pixel and set the imageData that way.
+ tmpImgData = tmpCtx.getImageData(0, 0, w, h);
+
+ // Copy over the imageData.
+ var tmpImgDataPixels = tmpImgData.data;
+ var len = tmpImgDataPixels.length;
+
+ while (len--) {
+ tmpImgDataPixels[len] = imgData.data[len];
+ }
+
+ tmpCtx.putImageData(tmpImgData, 0, 0);
+ ctx.drawImage(tmpCanvas, 0, -h);
+ this.restore();
+ },
+
+ // Marked content
+
+ markPoint: function canvasGraphicsMarkPoint(tag) {
+ TODO('Marked content');
+ },
+ markPointProps: function canvasGraphicsMarkPointProps(tag, properties) {
+ TODO('Marked content');
+ },
+ beginMarkedContent: function canvasGraphicsBeginMarkedContent(tag) {
+ TODO('Marked content');
+ },
+ beginMarkedContentProps:
+ function canvasGraphicsBeginMarkedContentProps(tag, properties) {
+ TODO('Marked content');
+ },
+ endMarkedContent: function canvasGraphicsEndMarkedContent() {
+ TODO('Marked content');
+ },
+
+ // Compatibility
+
+ beginCompat: function canvasGraphicsBeginCompat() {
+ TODO('ignore undefined operators (should we do that anyway?)');
+ },
+ endCompat: function canvasGraphicsEndCompat() {
+ TODO('stop ignoring undefined operators');
+ },
+
+ // Helper functions
+
+ consumePath: function canvasGraphicsConsumePath() {
+ if (this.pendingClip) {
+ var savedFillRule = null;
+ if (this.pendingClip == EO_CLIP)
+ savedFillRule = this.setEOFillRule();
+
+ this.ctx.clip();
+
+ this.pendingClip = null;
+ if (savedFillRule !== null)
+ this.restoreFillRule(savedFillRule);
+ }
+ this.ctx.beginPath();
+ },
+ // We generally keep the canvas context set for
+ // nonzero-winding, and just set evenodd for the operations
+ // that need them.
+ setEOFillRule: function canvasGraphicsSetEOFillRule() {
+ var savedFillRule = this.ctx.mozFillRule;
+ this.ctx.mozFillRule = 'evenodd';
+ return savedFillRule;
+ },
+ restoreFillRule: function canvasGraphicsRestoreFillRule(rule) {
+ this.ctx.mozFillRule = rule;
+ }
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/charsets.js b/apps/files_pdfviewer/js/pdfjs/src/charsets.js
new file mode 100755
index 00000000000..7f54ab32753
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/charsets.js
@@ -0,0 +1,105 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ISOAdobeCharset = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
+ 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
+ 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
+ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
+ 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
+ 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
+ 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
+ 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
+ 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
+ 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
+ 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
+ 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
+ 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
+ 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
+ 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
+ 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
+ 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
+ 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
+ 'ugrave', 'yacute', 'ydieresis', 'zcaron'
+];
+
+var ExpertCharset = [
+ '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
+ 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+ 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+ 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+ 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+ 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
+ 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
+ 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+ 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+ 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+ 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+ 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+ 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
+ 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
+ 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
+ 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
+ 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
+ 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'
+];
+
+var ExpertSubsetCharset = [
+ '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+ 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+ 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+ 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
+ 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
+ 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior'
+];
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js b/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js
new file mode 100755
index 00000000000..226843b7135
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js
@@ -0,0 +1,6933 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var CIDToUnicodeMaps = {
+ 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
+ {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
+ [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
+ 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
+ [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
+ [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
+ 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
+ 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
+ {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
+ {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
+ {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
+ {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
+ {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
+ {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
+ 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
+ {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
+ [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
+ 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
+ {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
+ 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
+ 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
+ {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
+ 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
+ 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
+ {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
+ {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
+ {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
+ {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
+ 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
+ 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
+ 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
+ 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
+ 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
+ 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
+ [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
+ 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
+ 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
+ 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
+ [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
+ [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
+ 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
+ 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
+ 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
+ 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
+ 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
+ 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
+ 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
+ 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
+ [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
+ 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
+ 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
+ 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
+ [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
+ 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
+ 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
+ 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
+ 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
+ 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
+ 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
+ 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
+ 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
+ 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
+ [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
+ 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
+ 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
+ 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
+ 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
+ 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
+ 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
+ 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
+ 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
+ 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
+ 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
+ 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
+ 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
+ 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
+ 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
+ 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
+ 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
+ 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
+ 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
+ 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
+ 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
+ [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
+ 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
+ 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
+ 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
+ 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
+ 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
+ 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
+ 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
+ [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
+ [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
+ 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
+ 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
+ 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
+ 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
+ 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
+ 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
+ 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
+ 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
+ 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
+ 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
+ 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
+ [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
+ 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
+ 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
+ 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
+ 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
+ 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
+ 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
+ [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
+ 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
+ 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
+ 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
+ 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
+ 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
+ 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
+ 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
+ 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
+ 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
+ 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
+ [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
+ 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
+ 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
+ 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
+ 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
+ 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
+ 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
+ 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
+ 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
+ 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
+ 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
+ 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
+ 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
+ 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
+ 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
+ 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
+ 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
+ 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
+ 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
+ [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
+ 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
+ [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
+ 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
+ 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
+ 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
+ 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
+ [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
+ 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
+ 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
+ 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
+ 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
+ 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
+ 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
+ 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
+ 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
+ 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
+ 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
+ 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
+ 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
+ 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
+ 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
+ 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
+ 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
+ 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
+ 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
+ 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
+ [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
+ 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
+ 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
+ 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
+ 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
+ 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
+ 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
+ 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
+ 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
+ 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
+ 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
+ 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
+ [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
+ 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
+ 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
+ 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
+ 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
+ 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
+ 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
+ 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
+ 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
+ [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
+ 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
+ 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
+ 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
+ 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
+ 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
+ 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
+ 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
+ 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
+ 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
+ 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
+ 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
+ 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
+ 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
+ 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
+ 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
+ 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
+ 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
+ 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
+ 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
+ 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
+ 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
+ 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
+ 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
+ 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
+ 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
+ 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
+ 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
+ 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
+ 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
+ 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
+ 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
+ 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
+ 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
+ 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
+ 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
+ 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
+ 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
+ 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
+ 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
+ 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
+ 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
+ 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
+ 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
+ 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
+ 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
+ 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
+ [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
+ 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
+ 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
+ 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
+ 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
+ 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
+ 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
+ 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
+ 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
+ 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
+ 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
+ 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
+ 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
+ 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
+ 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
+ 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
+ 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
+ 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
+ [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
+ 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
+ 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
+ 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
+ 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
+ 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
+ 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
+ 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
+ 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
+ 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
+ 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
+ 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
+ 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
+ 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
+ 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
+ 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
+ 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
+ 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
+ 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
+ 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
+ [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
+ 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
+ [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
+ 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
+ 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
+ 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
+ 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
+ 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
+ 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
+ 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
+ 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
+ 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
+ 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
+ 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
+ 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
+ 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
+ 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
+ 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
+ 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
+ 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
+ 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
+ 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
+ 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
+ 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
+ {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
+ 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
+ [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
+ 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
+ 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
+ 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
+ [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
+ 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
+ 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
+ [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
+ 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
+ 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
+ [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
+ 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
+ [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
+ 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
+ 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
+ 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
+ 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
+ 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
+ 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
+ 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
+ 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
+ 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
+ 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
+ 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
+ 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
+ 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
+ [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
+ 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
+ [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
+ 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
+ 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
+ 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
+ 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
+ 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
+ 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
+ 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
+ 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
+ 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
+ [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
+ 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
+ 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
+ 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
+ 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
+ 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
+ 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
+ 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
+ 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
+ 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
+ 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
+ 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
+ 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
+ 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
+ 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
+ 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
+ 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
+ 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
+ {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
+ 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
+ [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
+ 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
+ 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
+ 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
+ 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
+ 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
+ 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
+ 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
+ [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
+ 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
+ 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
+ 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
+ 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
+ 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
+ {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
+ 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
+ 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
+ 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
+ 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
+ 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
+ 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
+ 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
+ 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
+ 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
+ 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
+ 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
+ {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
+ 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
+ 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
+ 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
+ {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
+ 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
+ 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
+ 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
+ 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
+ {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
+ 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
+ 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
+ {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
+ [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
+ 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
+ {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
+ [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
+ 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
+ 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
+ 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
+ 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
+ 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
+ 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
+ [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
+ {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
+ 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
+ [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
+ 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
+ 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
+ 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
+ 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
+ [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
+ 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
+ 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
+ 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
+ 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
+ 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
+ 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
+ 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
+ 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
+ {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
+ 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
+ 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
+ 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
+ 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
+ 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
+ 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
+ {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
+ 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
+ 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
+ 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
+ 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
+ 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
+ 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
+ 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
+ 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
+ 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
+ {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
+ 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
+ [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
+ 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
+ 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
+ [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
+ {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
+ 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
+ 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
+ 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
+ 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
+ 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
+ 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
+ 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
+ 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
+ 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
+ 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
+ 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
+ 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
+ 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
+ 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
+ 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
+ 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
+ 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
+ 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
+ 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
+ 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
+ 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
+ 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
+ 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
+ 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
+ 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
+ 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
+ [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
+ 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
+ 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
+ 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
+ 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
+ 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
+ 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
+ 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
+ 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
+ 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
+ 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
+ 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
+ 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
+ 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
+ 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
+ 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
+ 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
+ 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
+ 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
+ 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
+ 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
+ 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
+ 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
+ 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
+ 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
+ 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
+ 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
+ {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
+ 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
+ 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
+ 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
+ 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
+ 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
+ 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
+ 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
+ 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
+ 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
+ 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
+ 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
+ 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
+ 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
+ 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
+ {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
+ 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
+ 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
+ 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
+ {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
+ 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
+ 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
+ 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
+ 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
+ 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
+ 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
+ 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
+ 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
+ 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
+ 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
+ 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
+ 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
+ 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
+ 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
+ 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
+ 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
+ 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
+ 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
+ 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
+ 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
+ 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
+ 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
+ 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
+ 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
+ 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
+ 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
+ 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
+ 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
+ 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
+ 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
+ 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
+ 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
+ {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
+ {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
+ [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
+ 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
+ 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
+ {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
+ 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
+ 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
+ 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
+ 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
+ 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
+ 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
+ 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
+ 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
+ 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
+ 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
+ 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
+ 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
+ {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
+ 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
+ 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
+ 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
+ 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
+ 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
+ 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
+ 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
+ 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
+ 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
+ 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
+ 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
+ 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
+ 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
+ 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
+ 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
+ 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
+ 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
+ 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
+ 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
+ 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
+ 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
+ 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
+ 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
+ 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
+ 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
+ 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
+ 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
+ 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
+ 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
+ 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
+ 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
+ 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
+ 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
+ {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
+ 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
+ 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
+ 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
+ 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
+ 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
+ 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
+ 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
+ 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
+ [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
+ 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
+ {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
+ {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
+ 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
+ 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
+ {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
+ {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
+ 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
+ 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
+ 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
+ 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
+ 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
+ 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
+ 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
+ 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
+ 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
+ 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
+ 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
+ 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
+ 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
+ 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
+ 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
+ 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
+ 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
+ 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
+ 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
+ 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
+ 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
+ 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
+ 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
+ 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
+ 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
+ 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
+ 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
+ {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
+ 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
+ {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
+ 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
+ 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
+ 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
+ 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
+ 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
+ {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
+ [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
+ 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
+ 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
+ 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
+ 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
+ {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
+ 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
+ {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
+ 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
+ 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
+ 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
+ {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
+ 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
+ {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
+ 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
+ {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
+ 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
+ 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
+ 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
+ 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
+ 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
+ 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
+ {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
+ 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
+ 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
+ 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
+ {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
+ 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
+ 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
+ {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
+ 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
+ {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
+ 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
+ {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
+ 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
+ {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
+ 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
+ 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
+ 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
+ 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
+ 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
+ {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
+ 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
+ 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
+ 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
+ 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
+ {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
+ 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
+ {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
+ {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
+ {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
+ 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
+ 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
+ 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
+ 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
+ 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
+ {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
+ {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
+ 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
+ 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
+ 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
+ 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
+ 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
+ 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
+ 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
+ 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
+ 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
+ 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
+ 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
+ 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
+ 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
+ [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
+ 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
+ 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
+ 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
+ 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
+ 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
+ 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
+ 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
+ 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
+ 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
+ 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
+ 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
+ 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
+ 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
+ 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
+ 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
+ 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
+ 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
+ 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
+ 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
+ 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
+ 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
+ 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
+ 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
+ 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
+ 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
+ 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
+ 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
+ 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
+ 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
+ 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
+ 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
+ {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
+ 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
+ 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
+ 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
+ {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
+ 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
+ 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
+ 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
+ {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
+ {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
+ {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
+ 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
+ {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
+ 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
+ {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
+ 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
+ {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
+ {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
+ 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
+ {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
+ {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
+ {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
+ {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
+ {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
+ {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
+ 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
+ {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
+ 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
+ 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
+ {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
+ 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
+ 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
+ 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
+ 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
+ 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
+ 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
+ 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
+ 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
+ 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
+ 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
+ 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
+ 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
+ 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
+ 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
+ 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
+ {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
+ [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
+ 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
+ {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
+ [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
+ {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
+ 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
+ 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
+ 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
+ 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
+ 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
+ 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
+ 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
+ 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
+ {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
+ 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
+ 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
+ [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
+ 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
+ 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
+ {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
+ 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
+ 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
+ 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
+ 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
+ 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
+ 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
+ [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
+ {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
+ 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
+ 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
+ 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
+ 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
+ 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
+ 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
+ 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
+ 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
+ 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
+ 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
+ {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
+ 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
+ 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
+ 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
+ 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
+ [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
+ [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
+ 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
+ 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
+ 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
+ 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
+ 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
+ {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
+ 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
+ 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
+ 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
+ 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
+ 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
+ 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
+ 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
+ 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
+ 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
+ [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
+ 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
+ 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
+ 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
+ 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
+ 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
+ [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
+ 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
+ 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
+ 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
+ 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
+ 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
+ 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
+ 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
+ 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
+ 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
+ [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
+ 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
+ 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
+ {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
+ 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
+ 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
+ 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
+ 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
+ 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
+ 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
+ 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
+ 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
+ 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
+ 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
+ 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
+ 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
+ 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
+ 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
+ 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
+ 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
+ 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
+ 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
+ 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
+ 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
+ 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
+ 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
+ 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
+ [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
+ {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
+ 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
+ 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
+ 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
+ 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
+ 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
+ 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
+ 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
+ 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
+ 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
+ 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
+ {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
+ 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
+ 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
+ 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
+ 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
+ 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
+ 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
+ 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
+ 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
+ {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
+ 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
+ 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
+ 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
+ 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
+ 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
+ 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
+ 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
+ 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
+ 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
+ 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
+ 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
+ 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
+ {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
+ {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
+ {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
+ 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
+ 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
+ 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
+ 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
+ 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
+ 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
+ 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
+ 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
+ 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
+ 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
+ {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
+ 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
+ {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
+ {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
+ {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
+ 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
+ {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
+ {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
+ 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
+ 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
+ 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
+ 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
+ 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
+ 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
+ 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
+ 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
+ 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
+ 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
+ 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
+ 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
+ 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
+ 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
+ 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
+ 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
+ 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
+ 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
+ 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
+ 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
+ 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
+ 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
+ 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
+ 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
+ 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
+ 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
+ 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
+ {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
+ 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
+ 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
+ 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
+ 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
+ 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
+ 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
+ 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
+ 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
+ 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
+ {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
+ 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
+ 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
+ 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
+ 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
+ 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
+ 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
+ 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
+ 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
+ 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
+ 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
+ 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
+ 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
+ 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
+ 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
+ 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
+ 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
+ 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
+ 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
+ {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
+ 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
+ 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
+ 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
+ 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
+ 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
+ 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
+ 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
+ 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
+ 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
+ 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
+ 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
+ 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
+ {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
+ 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
+ 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
+ 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
+ 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
+ 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
+ {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
+ 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
+ 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
+ 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
+ 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
+ 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
+ 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
+ {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
+ 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
+ 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
+ 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
+ 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
+ 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
+ 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
+ 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
+ {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
+ 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
+ {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
+ 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
+ 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
+ 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
+ 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
+ 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
+ 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
+ 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
+ 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
+ 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
+ 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
+ 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
+ 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
+ {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
+ 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
+ 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
+ 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
+ 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
+ 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
+ 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
+ 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
+ {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
+ 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
+ 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
+ {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
+ {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
+ 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
+ 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
+ {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
+ 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
+ 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
+ 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
+ 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
+ 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
+ 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
+ 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
+ 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
+ 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
+ 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
+ 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
+ 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
+ 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
+ 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
+ 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
+ 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
+ {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
+ {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
+ 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
+ {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
+ 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
+ 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
+ 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
+ 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
+ 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
+ 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
+ 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
+ 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
+ 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
+ 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
+ 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
+ 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
+ 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
+ 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
+ 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
+ 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
+ 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
+ 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
+ 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
+ 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
+ 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
+ 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
+ {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
+ 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
+ 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
+ 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
+ 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
+ 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
+ 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
+ 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
+ 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
+ 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
+ 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
+ {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
+ 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
+ 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
+ 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
+ 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
+ {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
+ 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
+ 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
+ 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
+ {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
+ 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
+ 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
+ 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
+ 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
+ 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
+ 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
+ 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
+ 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
+ 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
+ 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
+ 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
+ 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
+ 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
+ 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
+ {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
+ 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
+ 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
+ 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
+ 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
+ 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
+ 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
+ {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
+ {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
+ 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
+ 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
+ {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
+ 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
+ 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
+ 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
+ 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
+ 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
+ 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
+ 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
+ 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
+ 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
+ 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
+ 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
+ {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
+ {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
+ 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
+ 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
+ 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
+ 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
+ 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
+ {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
+ 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
+ {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
+ 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
+ {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
+ 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
+ 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
+ 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
+ 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
+ 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
+ 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
+ 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
+ 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
+ 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
+ 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
+ {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
+ 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
+ {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
+ 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
+ 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
+ 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
+ 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
+ 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
+ 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
+ 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
+ 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
+ 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
+ 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
+ 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
+ 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
+ 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
+ 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
+ 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
+ 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
+ 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
+ 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
+ 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
+ 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
+ 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
+ {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
+ 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
+ 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
+ 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
+ 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
+ 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
+ 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
+ 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
+ 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
+ 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
+ {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
+ 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
+ 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
+ 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
+ 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
+ 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
+ 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
+ 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
+ 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
+ {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
+ 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
+ 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
+ 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
+ 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
+ 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
+ {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
+ 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
+ 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
+ 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
+ {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
+ 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
+ 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
+ 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
+ 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
+ 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
+ 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
+ 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
+ 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
+ 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
+ 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
+ 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
+ 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
+ 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
+ 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
+ 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
+ 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
+ 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
+ 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
+ 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
+ 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
+ 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
+ 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
+ {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
+ 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
+ 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
+ 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
+ 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
+ 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
+ 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
+ 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
+ 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
+ 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
+ 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
+ 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
+ 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
+ {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
+ 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
+ {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
+ {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
+ 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
+ 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
+ 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
+ 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
+ 38315, 38741, 171581, 173594],
+ 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
+ {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
+ 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
+ {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
+ {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
+ 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
+ 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
+ {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
+ {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
+ {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
+ 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
+ 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
+ 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
+ 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
+ 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
+ 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
+ {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
+ {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
+ 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
+ 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
+ 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
+ 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
+ {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
+ {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
+ {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
+ 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
+ {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
+ 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
+ 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
+ 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
+ {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
+ {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
+ 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
+ {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
+ {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
+ 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
+ {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
+ {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
+ 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
+ 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
+ {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
+ {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
+ 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
+ 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
+ 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
+ {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
+ 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
+ {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
+ {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
+ {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
+ 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
+ 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
+ {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
+ 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
+ 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
+ {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
+ {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
+ {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
+ {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
+ {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
+ {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
+ {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
+ {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
+ 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
+ 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
+ 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
+ {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
+ {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
+ {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
+ {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
+ {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
+ {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
+ {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
+ 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
+ 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
+ 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
+ {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
+ 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
+ {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
+ {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
+ {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
+ 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
+ {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
+ {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
+ {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
+ {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
+ 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
+ {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
+ 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
+ {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
+ {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
+ 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
+ {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
+ 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
+ {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
+ {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
+ {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
+ {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
+ {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
+ 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
+ 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
+ {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
+ {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
+ 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
+ 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
+ {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
+ {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
+ {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
+ {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
+ 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
+ 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
+ {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
+ {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
+ 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
+ {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
+ {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
+ {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
+ 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
+ {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
+ {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
+ 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
+ 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
+ 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
+ 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
+ {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
+ 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
+ {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
+ 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
+ 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
+ {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
+ {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
+ {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
+ {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
+ 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
+ {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
+ 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
+ {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
+ 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
+ {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
+ {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
+ 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
+ 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
+ {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
+ {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
+ {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
+ {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
+ {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
+ {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
+ {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
+ 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
+ {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
+ 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
+ {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
+ {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
+ {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
+ {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
+ {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
+ {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
+ {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
+ 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
+ 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
+ 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
+ {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
+ {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
+ {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
+ 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
+ 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
+ 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
+ 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
+ {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
+ {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
+ 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
+ {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
+ {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
+ {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
+ 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
+ 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
+ {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
+ {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
+ {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
+ {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
+ {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
+ 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
+ {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
+ {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
+ {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
+ {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
+ {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
+ {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
+ {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
+ 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
+ {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
+ {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
+ {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
+ {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
+ 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
+ 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
+ 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
+ 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
+ {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
+ {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
+ {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
+ 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
+ {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
+ {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
+ {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
+ {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
+ 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
+ {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
+ {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
+ 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
+ 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
+ {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
+ 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
+ {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
+ {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
+ {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
+ {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
+ {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
+ {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
+ {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
+ 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
+ {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
+ {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
+ {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
+ 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
+ {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
+ {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
+ {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
+ 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
+ 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
+ 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
+ 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
+ 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
+ {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
+ 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
+ {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
+ {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
+ {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
+ 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
+ {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
+ {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
+ 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
+ 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
+ {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
+ {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
+ 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
+ {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
+ 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
+ {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
+ {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
+ 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
+ {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
+ 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
+ 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
+ {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
+ {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
+ 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
+ {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
+ {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
+ {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
+ 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
+ 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
+ {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
+ {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
+ 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
+ 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
+ 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
+ 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
+ {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
+ {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
+ {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
+ 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
+ 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
+ {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
+ 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
+ {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
+ 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
+ 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
+ {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
+ 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
+ {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
+ {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
+ 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
+ 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
+ {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
+ 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
+ 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
+ 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
+ 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
+ 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
+ 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
+ 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
+ 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
+ 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
+ {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
+ 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
+ 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
+ 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
+ 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
+ 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
+ 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
+ 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
+ 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
+ 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
+ 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
+ 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
+ [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
+ 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
+ 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
+ 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
+ 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
+ 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
+ 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
+ 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
+ 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
+ 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
+ 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
+ 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
+ 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
+ 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
+ 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
+ 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
+ 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
+ [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
+ 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
+ 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
+ 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
+ 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
+ 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
+ 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
+ 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
+ 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
+ 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
+ [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
+ 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
+ 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
+ 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
+ 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
+ [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
+ 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
+ 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
+ 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
+ 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
+ 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
+ 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
+ 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
+ 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
+ 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
+ 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
+ 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
+ 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
+ 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
+ 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
+ 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
+ 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
+ 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
+ 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
+ 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
+ [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
+ 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
+ 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
+ [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
+ 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
+ [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
+ [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
+ [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
+ [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
+ 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
+ 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
+ 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
+ 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
+ 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
+ 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
+ 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
+ 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
+ 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
+ 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
+ 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
+ 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
+ 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
+ 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
+ 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
+ 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
+ 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
+ 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
+ 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
+ [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
+ [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
+ [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
+ [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
+ [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
+ 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
+ [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
+ [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
+ [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
+ [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
+ [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
+ [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
+ [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
+ [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
+ [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
+ [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
+ [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
+ [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
+ [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
+ [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
+ [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
+ 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
+ [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
+ 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
+ [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
+ 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
+ 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
+ [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
+ [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
+ [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
+ [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
+ [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
+ [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
+ [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
+ [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
+ [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
+ [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
+ [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
+ [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
+ [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
+ [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
+ [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
+ [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
+ 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
+ [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
+ [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
+ [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
+ [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
+ [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
+ [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
+ [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
+ [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
+ [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
+ 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
+ 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
+ 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
+ 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
+ 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
+ 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
+ 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
+ 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
+ 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
+ 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
+ [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
+ 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
+ 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
+ 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
+ [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
+ 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
+ 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
+ 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
+ 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
+ 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
+ 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
+ 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
+ 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
+ [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
+ 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
+ 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
+ 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
+ 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
+ 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
+ [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
+ 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
+ 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
+ [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
+ 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
+ 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
+ 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
+ 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
+ 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
+ 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
+ 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
+ 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
+ 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
+ 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
+ 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
+ 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
+ [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
+ 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
+ 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
+ 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
+ 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
+ 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
+ [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
+ 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
+ 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
+ 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
+ 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
+ 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
+ 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
+ {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
+ 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
+ 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
+ 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
+ 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
+ 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
+ [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
+ 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
+ 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
+ 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
+ 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
+ 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
+ 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
+ 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
+ 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
+ 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
+ [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
+ 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
+ [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
+ 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
+ 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
+ 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
+ [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
+ 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
+ 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
+ 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
+ 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
+ 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
+ [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
+ 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
+ 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
+ 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
+ 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
+ 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
+ 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
+ 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
+ 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
+ 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
+ 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
+ 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
+ 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
+ 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
+ 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
+ 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
+ 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
+ {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
+ 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
+ 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
+ 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
+ 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
+ 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
+ [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
+ 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
+ [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
+ 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
+ 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
+ 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
+ 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
+ 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
+ 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
+ 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
+ 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
+ [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
+ [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
+ 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
+ [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
+ 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
+ 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
+ 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
+ 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
+ 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
+ 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
+ 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
+ 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
+ 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
+ [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
+ 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
+ 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
+ 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
+ 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
+ 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
+ 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
+ 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
+ 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
+ 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
+ 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
+ [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
+ 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
+ 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
+ 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
+ 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
+ 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
+ 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
+ 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
+ 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
+ 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
+ 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
+ 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
+ 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
+ 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
+ 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
+ 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
+ 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
+ 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
+ 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
+ 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
+ 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
+ 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
+ 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
+ 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
+ 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
+ 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
+ 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
+ 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
+ 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
+ [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
+ 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
+ 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
+ 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
+ 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
+ {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
+ 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
+ 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
+ [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
+ 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
+ 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
+ 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
+ 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
+ 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
+ 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
+ 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
+ [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
+ 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
+ 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
+ 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
+ [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
+ 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
+ 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
+ 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
+ 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
+ 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
+ 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
+ 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
+ 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
+ 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
+ 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
+ [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
+ 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
+ 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
+ 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
+ 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
+ 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
+ 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
+ [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
+ 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
+ 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
+ [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
+ 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
+ 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
+ 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
+ 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
+ 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
+ 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
+ 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
+ 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
+ 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
+ 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
+ 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
+ [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
+ 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
+ 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
+ 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
+ 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
+ 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
+ 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
+ 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
+ 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
+ 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
+ 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
+ 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
+ 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
+ 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
+ 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
+ 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
+ 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
+ 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
+ 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
+ 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
+ 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
+ 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
+ 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
+ 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
+ [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
+ 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
+ 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
+ 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
+ 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
+ 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
+ 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
+ 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
+ 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
+ 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
+ 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
+ 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
+ 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
+ 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
+ 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
+ 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
+ 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
+ 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
+ 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
+ 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
+ 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
+ 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
+ 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
+ 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
+ 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
+ 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
+ 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
+ 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
+ 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
+ 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
+ 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
+ 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
+ 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
+ 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
+ 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
+ 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
+ [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
+ 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
+ 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
+ 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
+ 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
+ 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
+ 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
+ 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
+ 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
+ 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
+ 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
+ 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
+ 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
+ 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
+ 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
+ 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
+ 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
+ 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
+ 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
+ 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
+ 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
+ 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
+ [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
+ 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
+ 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
+ [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
+ 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
+ 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
+ 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
+ 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
+ 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
+ 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
+ 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
+ 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
+ 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
+ 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
+ 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
+ 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
+ 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
+ [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
+ [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
+ 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
+ [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
+ 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
+ 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
+ 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
+ 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
+ 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
+ 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
+ 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
+ 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
+ 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
+ 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
+ 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
+ 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
+ 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
+ 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
+ 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
+ {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
+ 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
+ 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
+ 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
+ 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
+ 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
+ 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
+ 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
+ [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
+ 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
+ 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
+ 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
+ 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
+ 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
+ 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
+ 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
+ {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
+ {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
+ {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
+ 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
+ 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
+ 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
+ {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
+ {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
+ 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
+ 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
+ {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
+ 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
+ {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
+ 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
+ {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
+ 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
+ {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
+ 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
+ {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
+ {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
+ 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
+ {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
+ {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
+ {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
+ {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
+ {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
+ 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
+ {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
+ {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
+ {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
+ {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
+ 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
+ {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
+ {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
+ {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
+ {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
+ {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
+ {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
+ {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
+ {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
+ {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
+ 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
+ {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
+ {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
+ {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
+ {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
+ {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
+ {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
+ {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
+ {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
+ {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
+ {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
+ {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
+ {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
+ {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
+ {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
+ {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
+ {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
+ {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
+ {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
+ {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
+ {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
+ 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
+ {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
+ {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
+ {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
+ {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
+ {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
+ {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
+ {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
+ {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
+ {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
+ 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
+ {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
+ {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
+ {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
+ 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
+ {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
+ {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
+ {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
+ {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
+ {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
+ {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
+ {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
+ {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
+ {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
+ {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
+ 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
+ {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
+ {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
+ {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
+ 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
+ {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
+ {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
+ {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
+ {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
+ {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
+ {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
+ {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
+ {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
+ {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
+ {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
+ {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
+ {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
+ {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
+ {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
+ {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
+ {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
+ {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
+ {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
+ {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
+ {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
+ {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
+ {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
+ 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
+ {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
+ 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
+ {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
+ {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
+ {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
+ {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
+ {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
+ {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
+ 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
+ {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
+ {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
+ {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
+ {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
+ {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
+ 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
+ {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
+ {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
+ {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
+ {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
+ {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
+ {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
+ 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
+ {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
+ {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
+ {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
+ {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
+ {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
+ {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
+ {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
+ {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
+ {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
+ {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
+ {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
+ {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
+ {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
+ {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
+ {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
+ {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
+ {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
+ {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
+ {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
+ {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
+ {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
+ 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
+ {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
+ {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
+ {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
+ {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
+ {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
+ {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
+ {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
+ {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
+ {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
+ {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
+ {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
+ {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
+ {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
+ {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
+ {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
+ {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
+ {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
+ {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
+ {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
+ {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
+ {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
+ {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
+ {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
+ 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
+ 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
+ {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
+ {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
+ {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
+ {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
+ {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
+ {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
+ {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
+ {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
+ {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
+ 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
+ {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
+ {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
+ {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
+ {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
+ 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
+ {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
+ {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
+ {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
+ {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
+ {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
+ {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
+ {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
+ 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
+ {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
+ {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
+ {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
+ {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
+ {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
+ {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
+ {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
+ {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
+ {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
+ {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
+ {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
+ {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
+ 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
+ {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
+ {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
+ {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
+ {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
+ {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
+ {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
+ {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
+ 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
+ {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
+ {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
+ {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
+ {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
+ {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
+ {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
+ {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
+ {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
+ 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
+ {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
+ {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
+ {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
+ {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
+ {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
+ {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
+ {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
+ {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
+ {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
+ {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
+ 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
+ {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
+ {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
+ {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
+ {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
+ {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
+ {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
+ 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
+ {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
+ {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
+ {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
+ {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
+ {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
+ {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
+ {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
+ {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
+ {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
+ {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
+ {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
+ {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
+ {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
+ 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
+ {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
+ {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
+ {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
+ {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
+ {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
+ 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
+ {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
+ {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
+ {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
+ {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
+ {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
+ {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
+ {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
+ {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
+ {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
+ {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
+ {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
+ 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
+ {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
+ {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
+ {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
+ 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
+ {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
+ {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
+ {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
+ 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
+ {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
+ {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
+ {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
+ {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
+ {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
+ 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
+ {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
+ {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
+ {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
+ {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
+ {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
+ {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
+ {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
+ {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
+ {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
+ {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
+ {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
+ 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
+ {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
+ {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
+ {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
+ {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
+ {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
+ {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
+ {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
+ {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
+ {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
+ {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
+ {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
+ {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
+ {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
+ {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
+ {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
+ 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
+ {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
+ {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
+ {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
+ {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
+ {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
+ {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
+ {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
+ {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
+ {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
+ {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
+ 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
+ {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
+ {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
+ {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
+ {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
+ 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
+ {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
+ {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
+ {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
+ {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
+ {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
+ {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
+ {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
+ 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
+ {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
+ {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
+ {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
+ 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
+ {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
+ {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
+ {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
+ {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
+ {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
+ {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
+ {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
+ {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
+ {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
+ {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
+ {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
+ 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
+ {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
+ {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
+ 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
+ {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
+ {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
+ {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
+ {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
+ 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
+ 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
+ {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
+ {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
+ {f: 6, c: 55198}],
+ 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
+ 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
+ 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
+ {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
+ {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
+ {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
+ {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
+ {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
+ 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
+ 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
+ {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
+ 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
+ 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
+ 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
+ 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
+ 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
+ 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
+ {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
+ [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
+ [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
+ 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
+ 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
+ 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
+ {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
+ {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+ {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
+ [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
+ [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
+ [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
+ [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
+ [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
+ [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
+ [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
+ [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
+ [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
+ [12057, 21353, 63192], [12059, 21430, 63193],
+ [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
+ [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
+ [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
+ [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
+ [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
+ 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
+ [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
+ [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
+ [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
+ 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
+ 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
+ [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
+ [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
+ [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
+ [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
+ [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
+ 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
+ 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
+ {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
+ 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
+ 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
+ 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
+ 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
+ [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
+ [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
+ [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
+ [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
+ [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
+ [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
+ [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
+ 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
+ {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
+ {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
+ 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
+ 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
+ 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
+ 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
+ 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
+ {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
+ {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
+ 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
+ [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
+ [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
+ [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
+ [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
+ [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
+ 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
+ {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
+ 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
+ {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
+ {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
+ 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
+ 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
+ {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
+ {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
+ 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
+ {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
+ {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
+ 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
+ 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
+ [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
+ [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
+ [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
+ {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
+ [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
+ [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
+ [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
+ 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
+ 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
+ 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
+ {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
+ {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
+ 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
+ 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
+ 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
+ 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
+ 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
+ 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
+ {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
+ 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
+ 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
+ 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
+ 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
+ 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
+ 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
+ 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
+ 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
+ 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
+ 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
+ {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
+ 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
+ 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
+ [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
+ [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
+ [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
+ 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
+ [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
+ 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
+ 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
+ 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
+ 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
+ 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
+ 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
+ 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
+ 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
+ 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
+ {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
+ 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
+ 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
+ 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
+ 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
+ {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
+ 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
+ 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
+ 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
+ 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
+ [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
+ {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
+ 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
+ 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
+ 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
+ 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
+ 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
+ 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
+ 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
+ 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
+ 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
+ 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
+ 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
+ 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
+ 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
+ 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
+ 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
+ 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
+ [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
+ 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
+ [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
+ 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
+ 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
+ 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
+ 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
+ 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
+ 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
+ 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
+ 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
+ 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
+ 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
+ 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
+ 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
+ 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
+ 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
+ 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
+ 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
+ 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
+ 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
+ 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
+ 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
+ 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
+ {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
+ 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
+ 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
+ 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
+ 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
+ {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
+ 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
+ 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
+ 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
+ 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
+ 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
+ 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
+ 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
+ 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
+ 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
+ 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
+ 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
+ {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
+ [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
+ [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
+ 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
+ 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
+ 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
+ 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
+ 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
+ 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
+ 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
+ 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
+ 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
+ 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
+ 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
+ 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
+ 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
+ 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
+ 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
+ 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
+ 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
+ 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
+ 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
+ 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
+ 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
+ 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
+ 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
+ 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
+ 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
+ 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
+ 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
+ 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
+ {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
+ 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
+ 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
+ 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
+ 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
+ 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
+ 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
+ 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
+ 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
+ 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
+ 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
+ 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
+ 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
+ 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
+ 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
+ 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
+ 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
+ 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
+ [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
+ [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
+ 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
+ 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
+ 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
+ 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
+ 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
+ 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
+ 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
+ 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
+ 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
+ {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
+ 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
+ {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
+ 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
+ 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
+ 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
+ {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
+ 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
+ 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
+ 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
+ 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
+ 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
+ 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
+ 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
+ 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
+ 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
+ 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
+ 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
+ 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
+ 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
+ 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
+ {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
+ 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
+ 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
+ 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
+ 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
+ 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
+ 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
+ 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
+ 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
+ {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
+ 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
+ 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
+ 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
+ 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
+ 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
+ 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
+ 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
+ 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
+ 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
+ [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
+ 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
+ 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
+ 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
+ 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
+ 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
+ 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
+ [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
+ 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
+ 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
+ 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
+ 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
+ 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
+ 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
+ {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
+ 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
+ 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
+ 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
+ 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
+ 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
+ {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
+ 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
+ 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
+ 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
+ {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
+ 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
+ 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
+ {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
+ 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
+ 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
+ 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
+ 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
+ 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
+ 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
+ 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
+ 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
+ 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
+ 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
+ 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
+ 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
+ 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
+ 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
+ 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
+ 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
+ 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
+ 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
+ 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
+ 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
+ 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
+ [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
+ {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
+ 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
+ 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
+ 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
+ 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
+ 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
+ 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
+ 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
+ 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
+ {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
+ 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
+ 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
+ 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
+ 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
+ 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
+ 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
+ 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
+ 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
+ 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
+ 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
+ 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
+ {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
+ 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
+ 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
+ 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
+ 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
+ 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
+ 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
+ {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
+ 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
+ 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
+ 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
+ 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
+ {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
+ 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
+ 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
+ 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
+ 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
+ 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
+ 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
+ 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
+ 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
+ {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
+ {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
+ {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
+ [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
+ 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
+ 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
+ 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
+ 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
+ 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
+ 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
+ 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
+ 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
+ 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
+ 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
+ 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
+ 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
+ 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
+ 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
+ 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
+ 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
+ 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
+ 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
+ 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
+ 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
+ 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
+ [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
+ {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
+ 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
+ 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
+ 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
+ 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
+ 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
+ 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
+ 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
+ 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
+ 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
+ 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
+ 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
+ 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
+ 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
+ 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
+ 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
+ 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
+ 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
+ {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
+ 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
+ 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
+ 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
+ {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
+ 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
+ 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
+ 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
+ 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
+ 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
+ {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
+ 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
+ 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
+ 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
+ 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
+ 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
+ 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
+ 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
+ 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
+ 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
+ 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
+ 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
+ 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
+ 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
+ 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
+ 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
+ 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
+ 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
+ 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
+ {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
+ 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
+ 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
+ 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
+ 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
+ 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
+ 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
+ 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
+ {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
+ 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
+ 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
+ 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
+ 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
+ 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
+ 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
+ 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
+ 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
+ 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
+ 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
+ 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
+ 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
+ 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
+ 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
+ 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
+ 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
+ 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
+ {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
+ {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
+ 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
+ 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
+ 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
+ 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
+ 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
+ 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
+ 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
+ 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
+ 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
+ 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
+ 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
+ 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
+ [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
+ 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
+ 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
+ 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
+ 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
+ {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
+ 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
+ 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
+ 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
+ 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
+ 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
+ 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
+ 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
+ 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
+ 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
+ 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
+ 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
+ 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
+ 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
+ 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
+ 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
+ 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
+ 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
+ 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
+ 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
+ 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
+ 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
+ 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
+ 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
+ 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
+ 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
+ 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
+ {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
+ 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
+ {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
+ 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
+ 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
+ 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
+ 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
+ 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
+ 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
+ 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
+ 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
+ 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
+ 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
+ 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
+ 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
+ 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
+ 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
+ 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
+ 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
+ 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
+ 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
+ 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
+ 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
+ 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
+ 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
+ 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
+ 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
+ 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
+ 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
+ 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
+ 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
+ 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
+ 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
+ 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
+ {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
+ 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
+ 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
+ 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
+ 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
+ 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
+ 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
+ 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
+ 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
+ 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
+ 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
+ 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
+ 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
+ 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
+ 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
+ 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
+ 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
+ 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
+ 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
+ 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
+ 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
+ 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
+ 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
+ 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
+ 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
+ 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
+ {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
+ 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
+ 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
+ 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
+ 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
+ [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
+ [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
+ 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
+ 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
+ [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
+ 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
+ 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
+ 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
+ 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
+ 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
+ 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
+ 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
+ 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
+ [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
+ 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
+ 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
+ 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
+ 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
+ [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
+ 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
+ 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
+ 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
+ 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
+ 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
+ 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
+ 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
+ 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
+ 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
+ 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
+ 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
+ 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
+ {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
+ 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
+ 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
+ {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
+ 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
+ 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
+ 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
+ {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
+ 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
+ [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
+ 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
+ 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
+ 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
+ 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
+ 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
+ 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
+ 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
+ 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
+ {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
+ 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
+ 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
+ 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
+ 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
+ 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
+ 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
+ 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
+ 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
+ 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
+ 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
+ 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
+ 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
+ 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
+ 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
+ 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
+ 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
+ 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
+ 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
+ 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
+ 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
+ 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
+ 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
+ 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
+ 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
+ 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
+ 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
+ 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
+ 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
+ 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
+ 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
+ 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
+ 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
+ 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
+ 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
+ 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
+ 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
+ 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
+ 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
+ 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
+ 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
+ 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
+ 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
+ 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
+ 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
+ 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
+ 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
+ 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
+ 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
+ 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
+ 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
+ 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
+ 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
+ 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
+ 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
+ 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
+ {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
+ 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
+ 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
+ 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
+ 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
+ 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
+ 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
+ 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
+ {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
+ {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
+ 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
+ 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
+ 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
+ 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
+ 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
+ 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
+ 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
+ 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
+ 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
+ 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
+ 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
+ {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
+ 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
+ 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
+ {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
+ 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
+ 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
+ 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
+ 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
+ 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
+ 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
+ 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
+ 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
+ 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
+ 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
+ {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
+ 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
+ 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
+ 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
+ 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
+ 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
+ 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
+ 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
+ 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
+ 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
+ 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
+ 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
+ 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
+ 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
+ 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
+ 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
+ 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
+ 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
+ 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
+ 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
+ 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
+ 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
+ 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
+ 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
+ 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
+ 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
+ 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
+ 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
+ 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
+ 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
+ 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
+ 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
+ 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
+ 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
+ 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
+ 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
+ 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
+ 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
+ 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
+ {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
+ 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
+ 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
+ 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
+ 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
+ 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
+ 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
+ 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
+ [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
+ 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
+ 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
+ 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
+ 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
+ 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
+ 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
+ {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
+ 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
+ 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
+ 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
+ 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
+ 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
+ {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
+ 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
+ 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
+ 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
+ {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
+ 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
+ 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
+ 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
+ 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
+ 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
+ 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
+ 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
+ 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
+ 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
+ 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
+ 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
+ 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
+ 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
+ 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
+ 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
+ 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
+ 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
+ {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
+ 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
+ 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
+ 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
+ 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
+ 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
+ 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
+ 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
+ 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
+ {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
+ 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
+ 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
+ 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
+ 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
+ {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
+ 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
+ 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
+ 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
+ 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
+ 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
+ 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
+ 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
+ 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
+ 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
+ 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
+ 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
+ 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
+ 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
+ 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
+ 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
+ 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
+ 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
+ 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
+ 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
+ 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
+ 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
+ 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
+ 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
+ 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
+ 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
+ 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
+ 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
+ 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
+ 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
+ {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
+ 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
+ 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
+ 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
+ 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
+ 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
+ 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
+ {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
+ 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
+ {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
+ 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
+ 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
+ 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
+ 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
+ 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
+ {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
+ 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
+ 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
+ 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
+ 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
+ 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
+ {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
+ 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
+ {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
+ [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
+ 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
+ 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
+ [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
+ 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
+ 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
+ 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
+ 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
+ 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
+ {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
+ {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
+ 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
+ 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
+ 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
+ {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
+ 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
+ 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
+ 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
+ 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
+ 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
+ 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
+ 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
+ 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
+ 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
+ {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
+ [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
+ 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
+ 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
+ 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
+ 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
+ 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
+ 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
+ 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
+ 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
+ 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
+ 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
+ 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
+ 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
+ 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
+ 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
+ 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
+ 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
+ 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
+ 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
+ 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
+ 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
+ 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
+ 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
+ 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
+ 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
+ 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
+ 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
+ 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
+ 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
+ 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
+ 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
+ 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
+ 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
+ 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
+ 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
+ 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
+ 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
+ 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
+ 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
+ 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
+ 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
+ {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
+ 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
+ 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
+ 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
+ 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
+ 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
+ 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
+ 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
+ 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
+ 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
+ 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
+ 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
+ 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
+ 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
+ {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
+ 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
+ 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
+ {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
+ 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
+ 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
+ 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
+ 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
+ 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
+ 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
+ {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
+ 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
+ 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
+ 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
+ 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
+ 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
+ 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
+ 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
+ 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
+ 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
+ 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
+ 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
+ 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
+ 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
+ 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
+ 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
+ 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
+ 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
+ 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
+ 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
+ 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
+ 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
+ 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
+ {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
+ 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
+ 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
+ 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
+ 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
+ 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
+ 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
+ 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
+ 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
+ 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
+ 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
+ {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
+ 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
+ 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
+ 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
+ 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
+ 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
+ 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
+ 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
+ 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
+ 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
+ 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
+ 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
+ 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
+ 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
+ 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
+ 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
+ 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
+ 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
+ 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
+ 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
+ {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
+ 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
+ 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
+ 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
+ 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
+ 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
+ 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
+ {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
+ 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
+ {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
+ 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
+ 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
+ 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
+ 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
+ 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
+ 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
+ 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
+ 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
+ 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
+ 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
+ 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
+ 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
+ {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
+ 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
+ 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
+ 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
+ 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
+ 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
+ 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
+ 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
+ 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
+ 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
+ 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
+ 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
+ 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
+ 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
+ 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
+ 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
+ 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
+ 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
+ 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
+ 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
+ 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
+ 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
+ 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
+ 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
+ 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
+ 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
+ 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
+ {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
+ 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
+ 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
+ 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
+ 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
+ {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
+ 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
+ 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
+ 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
+ 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
+ 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
+ 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
+ {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
+ {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
+ {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
+ 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
+ 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
+ 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
+ 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
+ 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
+ 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
+ {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
+ 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
+ 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
+ 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
+ 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
+ {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
+ 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
+ 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
+ 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
+ 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
+ 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
+ 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
+ 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
+ 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
+ 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
+ {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
+ 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
+ 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
+ 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
+ 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
+ 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
+ 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
+ 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
+ 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
+ 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
+ {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
+ 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
+ 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
+ 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
+ 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
+ {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
+ 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
+ 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
+ {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
+ 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
+ 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
+ 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
+ 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
+ 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
+ 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
+ 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
+ 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
+ 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
+ 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
+ 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
+ {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
+ 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
+ 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
+ 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
+ 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
+ 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
+ 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
+ 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
+ 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
+ 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
+ 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
+ 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
+ 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
+ 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
+ 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
+ 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
+ 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
+ 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
+ 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
+ {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
+ 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
+ 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
+ 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
+ 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
+ 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
+ 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
+ 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
+ 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
+ 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
+ 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
+ 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
+ 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
+ {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
+ 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
+ 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
+ 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
+ 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
+ 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
+ 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
+ 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
+ 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
+ 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
+ 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
+ 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
+ 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
+ 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
+ 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
+ {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
+ 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
+ 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
+ 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
+ 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
+ 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
+ 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
+ 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
+ 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
+ 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
+ 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
+ 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
+ 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
+ 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
+ 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
+ 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
+ {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
+ 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
+ [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
+ 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
+ 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
+ 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
+ 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
+ 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
+ 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
+ [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
+ 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
+ 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
+ {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
+ 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
+ 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
+ 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
+ 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
+ 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
+ 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
+ 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
+ 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
+ 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
+ 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
+ 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
+ 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
+ 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
+ {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
+ 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
+ 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
+ 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
+ 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
+ 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
+ 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
+ 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
+ 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
+ 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
+ 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
+ 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
+ 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
+ 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
+ {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
+ {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
+ 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
+ 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
+ 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
+ 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
+ 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
+ {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
+ 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
+ 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
+ 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
+ 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
+ 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
+ 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
+ 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
+ {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
+ 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
+ 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
+ {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
+ 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
+ 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
+ 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
+ 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
+ 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
+ {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
+ 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
+ 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
+ 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
+ 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
+ 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
+ {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
+ 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
+ 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
+ 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
+ {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
+ {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
+ {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
+ 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
+ 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
+ {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
+ 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
+ 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
+ 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
+ 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
+ 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
+ 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
+ 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
+ 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
+ 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
+ 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
+ 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
+ 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
+ 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
+ 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
+ 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
+ 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
+ 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
+ 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
+ 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
+ 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
+ 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
+ {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
+ 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
+ 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
+ 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
+ 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
+ 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
+ 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
+ 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
+ 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
+ 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
+ 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
+ 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
+ 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
+ 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
+ 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
+ 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
+ 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
+ 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
+ {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
+ 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
+ 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
+ {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
+ 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
+ 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
+ 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
+ {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
+ 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
+ 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
+ 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
+ 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
+ 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
+ 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
+ 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
+ {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
+ 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
+ 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
+ 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
+ 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
+ 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
+ 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
+ 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
+ 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
+ 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
+ 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
+ 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
+ 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
+ {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
+ 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
+ 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
+ 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
+ {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
+ 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
+ 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
+ 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
+ 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
+ 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
+ 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
+ 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
+ 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
+ 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
+ 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
+ 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
+ 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
+ {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
+ 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
+ [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
+ [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
+ [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
+ [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
+ [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
+ [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
+ [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
+ [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
+ [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
+ [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
+ [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
+ [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
+ [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
+ [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
+ [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
+ [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
+ [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
+ [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
+ [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
+ [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
+ [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
+ [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
+ [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
+ [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
+ [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
+ [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
+ [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
+ [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
+ [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
+ [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
+ [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
+ [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
+ [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
+ [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
+ [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
+ [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
+ [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
+ [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
+ [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
+ [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
+ [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
+ [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
+ [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
+ [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
+ [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
+ [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
+ [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
+ [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
+ [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
+ [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
+ [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
+ [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
+ [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
+ [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
+ [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
+ [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
+ [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
+ [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
+ [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
+ [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
+ [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
+ {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
+ [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
+ [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
+ 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
+ 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
+ {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
+ [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
+ [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
+ [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
+ [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
+ [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
+ [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
+ [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
+ [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
+ [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
+ [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
+ [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
+ [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
+ [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
+ [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
+ [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
+ [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
+ [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
+ [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
+ [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
+ [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
+ [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
+ [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
+ [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
+ [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
+ [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
+ [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
+ [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
+ [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
+ [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
+ [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
+ [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
+ [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
+ [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
+ [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
+ [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
+ [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
+ [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
+ [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
+ [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
+ [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
+ [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
+ [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
+ [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
+ [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
+ [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
+ [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
+ [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
+ [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
+ [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
+ [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
+ [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
+ [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
+ [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
+ [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
+ [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
+ [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
+ [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
+ [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
+ [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
+ [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
+ [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
+ [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
+ [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
+ [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
+ [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
+ [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
+ [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
+ [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
+ [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
+ [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
+ [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
+ [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
+ [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
+ [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
+ [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
+ [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
+ [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
+ [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
+ [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
+ [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
+ [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
+ [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
+ [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
+ [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
+ [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
+ [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
+ [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
+ [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
+ [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
+ [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
+ [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
+ [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
+ [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
+ [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
+ [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
+ [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
+ [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
+ [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
+ [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
+ [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
+ [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
+ [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
+ [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
+ [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
+ [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
+ [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
+ [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
+ [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
+ [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
+ [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
+ [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
+ [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
+ [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
+ [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
+ [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
+ [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
+ [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
+ [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
+ [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
+ [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
+ [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
+ [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
+ [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
+ [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
+ [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
+ [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
+ [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
+ [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
+ [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
+ [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
+ [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
+ [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
+ [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
+ [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
+ [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
+ [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
+ [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
+ [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
+ [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
+ [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
+ [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
+ [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
+ [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
+ [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
+ [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
+ [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
+ [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
+ [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
+ [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
+ [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
+ [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
+ [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
+ [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
+ [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
+ [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
+ [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
+ [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
+ [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
+ [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
+ [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
+ [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
+ [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
+ [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
+ [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
+ [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
+ [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
+ [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
+ [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
+ [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
+ [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
+ [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
+ [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
+ [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
+ [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
+ [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
+ [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
+ [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
+ [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
+ [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
+ [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
+ [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
+ [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
+ [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
+ [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
+ [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
+ [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
+ [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
+ [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
+ [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
+ [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
+ [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
+ [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
+ [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
+ [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
+ [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
+ [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
+ [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
+ [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
+ [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
+ [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
+ [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
+ [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
+ [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
+ [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
+ [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
+ [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
+ [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
+ [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
+ [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
+ [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
+ [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
+ [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
+ [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
+ [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
+ [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
+ [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
+ [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
+ [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
+ [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
+ [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
+ [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
+ [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
+ [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
+ [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
+ [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
+ [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
+ [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
+ [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
+ [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
+ [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
+ [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
+ [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
+ [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
+ [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
+ [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
+ [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
+ [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
+ [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
+ [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
+ [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
+ [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
+ [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
+ [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
+ [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
+ [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
+ [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
+ [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
+ [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
+ [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
+ [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
+ [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
+ [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
+ [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
+ [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
+ [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
+ [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
+ [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
+ [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
+ [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
+ [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
+ [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
+ [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
+ [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
+ [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
+ [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
+ [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
+ [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
+ [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
+ [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
+ [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
+ [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
+ [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
+ [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
+ [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
+ [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
+ [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
+ [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
+ [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
+ [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
+ [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
+ [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
+ [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
+ [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
+ [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
+ [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
+ [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
+ [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
+ [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
+ [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
+ [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
+ [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
+ [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
+ [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
+ [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
+ [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
+ [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
+ [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
+ [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
+ [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
+ [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
+ [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
+ [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
+ [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
+ [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
+ [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
+ [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
+ [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
+ [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
+ [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
+ [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
+ [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
+ [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
+ [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
+ [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
+ [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
+ [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
+ [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
+ [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
+ [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
+ [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
+ [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
+ [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
+ [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
+ [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
+ [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
+ [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
+ [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
+ [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
+ [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
+ [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
+ [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
+ [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
+ [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
+ [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
+ [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
+ [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
+ [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
+ [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
+ [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
+ [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
+ [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
+ [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
+ [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
+ [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
+ [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
+ [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
+ [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
+ [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
+ [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
+ [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
+ [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
+ [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
+ [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
+ [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
+ [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
+ [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
+ [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
+ [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
+ [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
+ [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
+ [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
+ [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
+ [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
+ [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
+ [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
+ [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
+ [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
+ [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
+ [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
+ [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
+ [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
+ [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
+ [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
+ [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
+ [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
+ [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
+ [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
+ [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
+ [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
+ [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
+ [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
+ [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
+ [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
+ [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
+ [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
+ [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
+ [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
+ [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
+ [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
+ [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
+ [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
+ [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
+ [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
+ [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
+ [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
+ [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
+ [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
+ [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
+ [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
+ [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
+ [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
+ [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
+ [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
+ [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
+ [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
+ [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
+ [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
+ [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
+ [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
+ [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
+ [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
+ [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
+ [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
+ [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
+ [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
+ [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
+ [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
+ [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
+ [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
+ [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
+ [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
+ [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
+ [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
+ [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
+ [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
+ [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
+ [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
+ [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
+ [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
+ [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
+ [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
+ [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
+ [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
+ [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
+ [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
+ [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
+ [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
+ [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
+ [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
+ [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
+ [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
+ [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
+ [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
+ [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
+ [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
+ [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
+ [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
+ [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
+ [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
+ [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
+ [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
+ [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
+ [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
+ [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
+ [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
+ [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
+ [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
+ [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
+ [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
+ [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
+ [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
+ [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
+ [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
+ [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
+ [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
+ [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
+ [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
+ [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
+ [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
+ [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
+ [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
+ [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
+ [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
+ [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
+ [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
+ [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
+ [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
+ [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
+ [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
+ [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
+ [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
+ [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
+ [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
+ [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
+ [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
+ [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
+ [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
+ [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
+ [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
+ [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
+ [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
+ [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
+ [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
+ [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
+ [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
+ [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
+ [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
+ [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
+ 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
+ [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
+ [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
+ [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
+ [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
+ [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
+ [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
+ [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
+ [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
+ [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
+ [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
+ 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
+ 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
+ [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
+ [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
+ [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
+ [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
+ [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
+ [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
+ [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
+ [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
+ [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
+ [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
+ [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
+ [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
+ [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
+ [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
+ [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
+ [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
+ [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
+ [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
+ [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
+ [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
+ [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
+ [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
+ [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
+ [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
+ [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
+ [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
+ [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
+ [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
+ [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
+ [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
+ [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
+ [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
+ [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
+ [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
+ [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
+ [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
+ [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
+ [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
+ [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
+ [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
+ [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
+ [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
+ [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
+ [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
+ [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
+ [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
+ [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
+ [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
+ [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
+ [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
+ [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
+ [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
+ [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
+ [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
+ [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
+ [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
+ [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
+ [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
+ [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
+ [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
+ [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
+ [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
+ [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
+ [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
+ [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
+ [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
+ [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
+ [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
+ [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
+ [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
+ [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
+ [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
+ [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
+ [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
+ [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
+ [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
+ [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
+ [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
+ [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
+ [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
+ [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
+ [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
+ [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
+ [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
+ [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
+ [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
+ [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
+ [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
+ [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
+ [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
+ [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
+ [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
+ [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
+ [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
+ [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
+ [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
+ [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
+ [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
+ [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
+ [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
+ [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
+ [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
+ [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
+ [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
+ [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
+ [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
+ [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
+ [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
+ [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
+ [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
+ [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
+ [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
+ [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
+ [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
+ [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
+ [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
+ [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
+ [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
+ [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
+ [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
+ [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
+ [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
+ [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
+ [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
+ [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
+ [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
+ [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
+ [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
+ [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
+ [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
+ [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
+ [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
+ [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
+ [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
+ [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
+ [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
+ [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
+ [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
+ [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
+ [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
+ [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
+ [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
+ [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
+ [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
+ [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
+ [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
+ [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
+ [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
+ [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
+ [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
+ [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
+ [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
+ [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
+ [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
+ [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
+ [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
+ [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
+ [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
+ [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
+ [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
+ [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
+ [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
+ [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
+ [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
+ [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
+ [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
+ [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
+ [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
+ [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
+ [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
+ [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
+ [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
+ [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
+ [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
+ [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
+ [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
+ [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
+ [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
+ [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
+ [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
+ [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
+ [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
+ [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
+ [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
+ [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
+ [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
+ [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
+ [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
+ [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
+ [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
+ [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
+ [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
+ [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
+ [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
+ [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
+ [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
+ [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
+ [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
+ [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
+ [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
+ [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
+ [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
+ [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
+ [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
+ [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
+ [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
+ [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
+ [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
+ [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
+ [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
+ [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
+ [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
+ [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
+ [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
+ [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
+ [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
+ [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
+ [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
+ [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
+ [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
+ [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
+ [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
+ [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
+ [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
+ [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
+ [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
+ [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
+ [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
+ [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
+ [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
+ [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
+ [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
+ [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
+ [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
+ [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
+ [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
+ [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
+ [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
+ [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
+ [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
+ [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
+ [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
+ [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
+ [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
+ [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
+ [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
+ [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
+ [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
+ 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
+ [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
+ [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
+ [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
+ [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
+ [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
+ [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
+ [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
+ [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
+ [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
+ [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
+ [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
+ [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
+ [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
+ [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
+ {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
+ {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
+ {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
+ {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
+ [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
+ [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
+ [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
+ [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
+ [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
+ [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
+ [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
+ [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
+ [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
+ [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
+ [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
+ [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
+ [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
+ [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
+ [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
+ [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
+ [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
+ [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
+ [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
+ [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
+ [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
+ [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
+ [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
+ [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
+ [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
+ [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
+ [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
+ [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
+ [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
+ [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
+ [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
+ [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
+ [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
+ [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
+ [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
+ [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
+ [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
+ [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
+ [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
+ [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
+ [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
+ [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
+ [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
+ [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
+ [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
+ [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
+ [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
+ [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
+ [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
+ [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
+ [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
+ [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
+ [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
+ [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
+ [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
+ [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
+ [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
+ [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
+ [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
+ [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
+ [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
+ [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
+ [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
+ [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
+ [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
+ [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
+ [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
+ [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
+ [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
+ [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
+ [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
+ [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
+ [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
+ [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
+ [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
+ [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
+ [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
+ [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
+ [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
+ [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
+ [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
+ [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
+ [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
+ [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
+ [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
+ [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
+ [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
+ [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
+ [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
+ [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
+ [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
+ [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
+ [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
+ [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
+ [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
+ [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
+ [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
+ [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
+ [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
+ [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
+ [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
+ [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
+ [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
+ [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
+ [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
+ [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
+ [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
+ [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
+ [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
+ [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
+ [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
+ [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
+ [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
+ [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
+ [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
+ [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
+ [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
+ [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
+ [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
+ [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
+ [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
+ [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
+ [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
+ [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
+ [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
+ [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
+ [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
+ [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
+ [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
+ [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
+ [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
+ [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
+ [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
+ [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
+ [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
+ [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
+ [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
+ [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
+ [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
+ [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
+ [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
+ [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
+ [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
+ [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
+ [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
+ [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
+ [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
+ [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
+ [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
+ [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
+ [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
+ [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
+ [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
+ [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
+ [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
+ [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
+ [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
+ [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
+ [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
+ [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
+ [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
+ [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
+ [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
+ [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
+ [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
+ [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
+ [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
+ [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
+ [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
+ [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
+ [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
+ [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
+ [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
+ [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
+ [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
+ [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
+ [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
+ [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
+ [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
+ [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
+ [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
+ [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
+ [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
+ [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
+ [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
+ [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
+ [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
+ [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
+ [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
+ [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
+ [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
+ [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
+ [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
+ [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
+ [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
+ [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
+ [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
+ [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
+ [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
+ [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
+ [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
+ [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
+ [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
+ [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
+ [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
+ [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
+ [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
+ [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
+ [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
+ [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
+ [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
+ [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
+ [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
+ [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
+ [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
+ [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
+ [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
+ [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
+ [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
+ [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
+ [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
+ [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
+ [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
+ [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
+ [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
+ [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
+ [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
+ [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
+ [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
+ [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
+ [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
+ [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
+ [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
+ [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
+ [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
+ [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
+ [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
+ [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
+ [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
+ [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
+ [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
+ [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
+ [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
+ [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
+ [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
+ [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
+ [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
+ [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
+ [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
+ [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
+ [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
+ [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
+ [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
+ [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
+ [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
+ [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
+ [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
+ [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
+ [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
+ [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
+ [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
+ [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
+ [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
+ [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
+ [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
+ [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
+ [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
+ [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
+ [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
+ [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
+ [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
+ [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
+ [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
+ [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
+ [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
+ [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
+ [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
+ [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
+ [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
+ [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
+ [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
+ [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
+ [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
+ [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
+ [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
+ [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
+ [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
+ [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
+ [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
+ [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
+ [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
+ [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
+ [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
+ [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
+ [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
+ [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
+ [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
+ [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
+ [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
+ [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
+ [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
+ [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
+ [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
+ 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
+ [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
+ [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
+ 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
+ [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
+ 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
+ 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
+ [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
+ [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
+ 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
+ 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
+ [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
+ 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
+ [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
+ 23446, 62959, 32347],
+ 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
+ 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
+ {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
+ {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
+ 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
+ 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
+ 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
+ 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
+ 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
+ {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
+ {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
+ {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+ {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
+ {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
+ {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
+ {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
+ 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
+ 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
+ {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
+ 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
+ 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
+ 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
+ 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
+ [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
+ 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
+ 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
+ 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
+ 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
+ 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
+ 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
+ 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
+ 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
+ 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
+ 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
+ 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
+ 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
+ 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
+ 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
+ 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
+ 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
+ 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
+ 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
+ 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
+ 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
+ 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
+ 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
+ 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
+ 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
+ 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
+ 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
+ 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
+ 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
+ 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
+ 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
+ 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
+ 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
+ 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
+ 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
+ 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
+ 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
+ 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
+ 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
+ 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
+ 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
+ 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
+ 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
+ [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
+ 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
+ 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
+ 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
+ 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
+ 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
+ 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
+ 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
+ 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
+ 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
+ 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
+ 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
+ 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
+ [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
+ 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
+ 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
+ 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
+ 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
+ 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
+ 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
+ [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
+ 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
+ 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
+ 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
+ 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
+ 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
+ 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
+ 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
+ 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
+ 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
+ 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
+ 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
+ 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
+ [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
+ 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
+ [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
+ 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
+ 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
+ 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
+ [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
+ 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
+ [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
+ [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
+ 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
+ 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
+ [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
+ 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
+ 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
+ [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
+ 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
+ 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
+ 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
+ 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
+ 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
+ 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
+ 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
+ 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
+ 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
+ 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
+ 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
+ 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
+ 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
+ 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
+ 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
+ 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
+ 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
+ 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
+ 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
+ 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
+ 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
+ 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
+ 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
+ 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
+ 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
+ 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
+ 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
+ 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
+ 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
+ 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
+ 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
+ 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
+ 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
+ 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
+ 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
+ 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
+ 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
+ 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
+ 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
+ [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
+ 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
+ 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
+ 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
+ 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
+ [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
+ [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
+ 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
+ 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
+ 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
+ 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
+ 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
+ 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
+ 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
+ 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
+ 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
+ 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
+ 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
+ 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
+ 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
+ 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
+ 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
+ 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
+ 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
+ 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
+ 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
+ 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
+ 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
+ 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
+ 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
+ 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
+ [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
+ 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
+ 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
+ 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
+ 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
+ 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
+ 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
+ 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
+ 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
+ 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
+ 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
+ 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
+ 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
+ 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
+ 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
+ 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
+ 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
+ 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
+ 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
+ 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
+ [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
+ 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
+ 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
+ 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
+ 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
+ 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
+ [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
+ 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
+ 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
+ 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
+ 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
+ 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
+ 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
+ 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
+ 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
+ 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
+ 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
+ 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
+ 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
+ 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
+ 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
+ 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
+ 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
+ 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
+ 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
+ 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
+ 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
+ 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
+ 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
+ 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
+ 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
+ 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
+ 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
+ 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
+ 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
+ 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
+ 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
+ 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
+ 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
+ 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
+ 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
+ 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
+ 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
+ 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
+ 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
+ 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
+ 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
+ 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
+ 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
+ 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
+ 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
+ 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
+ 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
+ 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
+ [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
+ [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
+ 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
+ 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
+ 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
+ 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
+ [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
+ 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
+ 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
+ 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
+ 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
+ [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
+ 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
+ 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
+ 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
+ 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
+ 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
+ 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
+ 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
+ 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
+ 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
+ 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
+ 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
+ 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
+ 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
+ [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
+ 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
+ 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
+ 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
+ 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
+ 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
+ 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
+ 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
+ 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
+ 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
+ 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
+ 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
+ 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
+ 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
+ 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
+ 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
+ [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
+ 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
+ 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
+ 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
+ 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
+ [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
+ 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
+ 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
+ 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
+ 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
+ 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
+ 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
+ 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
+ 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
+ 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
+ [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
+ 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
+ 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
+ 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
+ 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
+ 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
+ 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
+ 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
+ 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
+ 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
+ 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
+ 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
+ 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
+ [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
+ 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
+ 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
+ [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
+ 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
+ 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
+ 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
+ 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
+ [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
+ 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
+ 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
+ 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
+ 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
+ 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
+ [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
+ 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
+ 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
+ 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
+ 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
+ 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
+ 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
+ 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
+ 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
+ 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
+ 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
+ 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
+ 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
+ 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
+ [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
+ 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
+ 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
+ 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
+ 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
+ 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
+ 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
+ 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
+ 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
+ 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
+ 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
+ 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
+ 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
+ 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
+ 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
+ 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
+ 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
+ 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
+ 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
+ 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
+ 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
+ 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
+ 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
+ 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
+ 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
+ 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
+ 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
+ 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
+ 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
+ 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
+ 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
+ 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
+ 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
+ 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
+ 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
+ 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
+ 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
+ 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
+ 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
+ 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
+ [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
+ 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
+ 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
+ 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
+ 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
+ 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
+ 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
+ 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
+ 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
+ [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
+ 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
+ [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
+ 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
+ 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
+ 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
+ [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
+ 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
+ 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
+ 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
+ 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
+ {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
+ 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
+ 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
+ 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
+ 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
+ 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
+ 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
+ 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
+ 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
+ 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
+ [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
+ [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
+ 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
+ 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
+ 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
+ {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
+ {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
+ 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
+ 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
+ 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
+ {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
+ 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
+ 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
+ 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
+ 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
+ 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
+ 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
+ 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
+ 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
+ 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
+ {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
+ 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
+ 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
+ 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
+ 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
+ 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
+ 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
+ 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
+ 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
+ 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
+ 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
+ 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
+ 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
+ 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
+ {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
+ 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
+ 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
+ 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
+ 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
+ {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
+ 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
+ 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
+ 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
+ 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
+ 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
+ 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
+ [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
+ [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
+ 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
+ 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
+ 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
+ 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
+ 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
+ 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
+ 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
+ {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
+ 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
+ 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
+ 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
+ {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
+ 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
+ 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
+ {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
+ 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
+ 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
+ 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
+ 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
+ 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
+ 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
+ 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
+ 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
+ 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
+ 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
+ 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
+ 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
+ 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
+ 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
+ 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
+ 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
+ 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
+ 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
+ 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
+ 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
+ [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
+ {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
+ {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
+ 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
+ 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
+ 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
+ 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
+ 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
+ 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
+ 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
+ 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
+ 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
+ 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
+ {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
+ 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
+ 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
+ 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
+ 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
+ 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
+ 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
+ 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
+ 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
+ {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
+ 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
+ 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
+ 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
+ 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
+ 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
+ [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
+ 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
+ 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
+ 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
+ {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
+ 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
+ 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
+ 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
+ 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
+ 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
+ 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
+ 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
+ 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
+ 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
+ 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
+ {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
+ 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
+ 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
+ {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
+ {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
+ 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
+ {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
+ 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
+ [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
+ 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
+ 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
+ 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
+ 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
+ {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
+ 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
+ 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
+ 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
+ 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
+ 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
+ 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
+ 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
+ {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
+ 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
+ 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
+ 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
+ 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
+ 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
+ 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
+ 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
+ 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
+ {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
+ {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
+ 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
+ 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
+ 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
+ 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
+ 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
+ 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
+ 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
+ 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
+ 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
+ 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
+ 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
+ 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
+ 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
+ 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
+ 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
+ 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
+ {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
+ 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
+ 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
+ [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
+ 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
+ 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
+ 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
+ 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
+ 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
+ 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
+ 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
+ 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
+ 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
+ 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
+ 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
+ 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
+ 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
+ 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
+ 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
+ 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
+ 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
+ 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
+ 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
+ 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
+ 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
+ {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
+ 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
+ {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
+ {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
+ 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
+ {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
+ 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
+ {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
+ 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
+ {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
+ {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
+ {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
+ {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
+ 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
+ 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
+ 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
+ {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
+ {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
+ 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
+ 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
+ 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
+ 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
+ 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
+ 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
+ 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
+ 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
+ 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
+ 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
+ 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
+ [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
+ 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
+ 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
+ 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
+ {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
+ 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
+ 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
+ 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
+ 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
+ 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
+ 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
+ {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
+ 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
+ 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
+ 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
+ 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
+ {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
+ 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
+ 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
+ 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
+ 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
+ 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
+ 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
+ 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
+ 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
+ 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
+ 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
+ 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
+ {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
+ 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
+ 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
+ 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
+ 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
+ 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
+ {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
+ 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
+ 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
+ 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
+ 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
+ {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
+ 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
+ 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
+ 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
+ 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
+ {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
+ {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
+ 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
+ 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
+ {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
+ {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
+ {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
+ 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
+ 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
+ {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
+ 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
+ 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
+ {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
+ 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
+ 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
+ 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
+ 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
+ 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
+ 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
+ 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
+ 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
+ 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
+ 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
+ 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
+ [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
+ 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
+ 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
+ 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
+ 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
+ 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
+ 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
+ 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
+ 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
+ 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
+ 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
+ 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
+ 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
+ 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
+ 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
+ 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
+ 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
+ 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
+ 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
+ [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
+ 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
+ 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
+ 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
+ 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
+ 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
+ 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
+ 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
+ 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
+ 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
+ [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
+ 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
+ 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
+ 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
+ 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
+ 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
+ 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
+ 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
+ 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
+ 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
+ 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
+ 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
+ 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
+ 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
+ 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
+ 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
+ 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
+ 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
+ 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
+ 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
+ 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
+ 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
+ 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
+ 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
+ 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
+ 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
+ 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
+ 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
+ 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
+ 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
+ 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
+ [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
+ 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
+ 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
+ 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
+ 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
+ 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
+ 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
+ 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
+ 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
+ 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
+ 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
+ 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
+ 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
+ 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
+ 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
+ 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
+ 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
+ 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
+ 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
+ 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
+ [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
+ 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
+ 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
+ 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
+ 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
+ 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
+ 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
+ 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
+ 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
+ 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
+ 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
+ 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
+ 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
+ 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
+ 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
+ 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
+ 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
+ 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
+ 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
+ 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
+ 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
+ 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
+ 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
+ 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
+ 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
+ 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
+ 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
+ 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
+ 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
+ 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
+ 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
+ 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
+ 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
+ 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
+ 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
+ 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
+ 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
+ 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
+ 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
+ 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
+ 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
+ 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
+ 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
+ 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
+ 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
+ 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
+ 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
+ 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
+ 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
+ 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
+ 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
+ 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
+ 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
+ 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
+ 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
+ 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
+ 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
+ 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
+ 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
+ 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
+ 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
+ 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
+ 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
+ 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
+ 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
+ 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
+ {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
+ 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
+ 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
+ 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
+ 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
+ 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
+ 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
+ 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
+ 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
+ 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
+ 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
+ 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
+ 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
+ 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
+ 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
+ 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
+ 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
+ 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
+ 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
+ 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
+ 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
+ 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
+ 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
+ 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
+ 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
+ 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
+ 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
+ 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
+ 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
+ {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
+ 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
+ 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
+ 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
+ {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
+ 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
+ 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
+ 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
+ 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
+ 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
+ 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
+ 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
+ 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
+ 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
+ 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
+ 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
+ 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
+ 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
+ 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
+ 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
+ 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
+ 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
+ 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
+ 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
+ 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
+ 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
+ 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
+ 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
+ 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
+ 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
+ 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
+ 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
+ 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
+ [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
+ 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
+ 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
+ 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
+ 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
+ {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
+ {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
+ {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
+ 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
+ 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
+ {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
+ 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
+ {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
+ 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
+ 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
+ {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
+ {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
+ 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
+ {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
+ {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
+ 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
+ {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
+ {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
+ 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
+ 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
+ {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
+ 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
+ {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
+ 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
+ {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
+ {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
+ 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
+ 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
+ {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
+ {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
+ {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
+ {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
+ {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
+ {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
+ {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
+ {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
+ {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
+ {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
+ 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
+ {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
+ {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
+ 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
+ {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
+ {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
+ {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
+ 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
+ {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
+ {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
+ {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
+ {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
+ {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
+ {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
+ 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
+ {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
+ {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
+ {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
+ 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
+ {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
+ {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
+ {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
+ {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
+ {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
+ {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
+ {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
+ {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
+ {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
+ 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
+ {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
+ {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
+ {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
+ {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
+ {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
+ 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
+ {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
+ 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
+ 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
+ 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
+ {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
+ {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
+ {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
+ 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
+ {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
+ {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
+ 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
+ {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
+ {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
+ {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
+ {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
+ {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
+ {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
+ {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
+ 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
+ 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
+ {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
+ {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
+ {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
+ {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
+ {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
+ {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
+ 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
+ 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
+ {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
+ {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
+ 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
+ {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
+ {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
+ 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
+ {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
+ {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
+ {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
+ {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
+ {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
+ {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
+ 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
+ {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
+ 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
+ {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
+ {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
+ {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
+ {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
+ {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
+ {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
+ {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
+ {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
+ {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
+ {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
+ {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
+ {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
+ 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
+ {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
+ {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
+ {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
+ {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
+ {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
+ 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
+ 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
+ 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
+ {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
+ {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
+ {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
+ {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
+ 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
+ {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
+ {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
+ {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
+ {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
+ {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
+ {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
+ {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
+ {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
+ 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
+ {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
+ {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
+ {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
+ {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
+ {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
+ {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
+ {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
+ {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
+ {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
+ {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
+ {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
+ {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
+ 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
+ {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
+ 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
+ {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
+ {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
+ 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
+ {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
+ {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
+ {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
+ {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
+ {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
+ 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
+ {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
+ {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
+ {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
+ {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
+ {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
+ {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
+ {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
+ {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
+ 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
+ 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
+ {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
+ 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
+ {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
+ {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
+ {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
+ {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
+ {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
+ 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
+ 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
+ {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
+ 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
+ {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
+ {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
+ {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
+ {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
+ 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
+ {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
+ 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
+ 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
+ {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
+ {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
+ {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
+ {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
+ {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
+ {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
+ {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
+ {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
+ {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
+ {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
+ {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
+ {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
+ {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
+ {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
+ {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
+ {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
+ {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
+ {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
+ {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
+ {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
+ {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
+ {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
+ {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
+ {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
+ {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
+ {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
+ {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
+ {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
+ {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
+ 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
+ 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
+ {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
+ {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
+ {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
+ 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
+ {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
+ {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
+ {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
+ {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
+ {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
+ {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
+ {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
+ {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
+ {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
+ {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
+ {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
+ 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
+ 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
+ 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
+ {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
+ {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
+ {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
+ {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
+ {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
+ {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
+ {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
+ {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
+ {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
+ 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
+ {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
+ 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
+ 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
+ {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
+ {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
+ {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
+ {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
+ {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
+ 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
+ {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
+ {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
+ 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
+ {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
+ {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
+ {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
+ {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
+ {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
+ {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
+ {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
+ {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
+ {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
+ 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
+ {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
+ {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
+ {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
+ {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
+ {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
+ {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
+ {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
+ 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
+ {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
+ {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
+ {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
+ 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
+ {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
+ {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
+ 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
+ {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
+ 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
+ {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
+ 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
+ {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
+ 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
+ {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
+ 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
+ {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
+ {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
+ {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
+ {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
+ 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
+ {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
+ {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
+ {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
+ {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
+ {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
+ {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
+ {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
+ {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
+ {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
+ {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
+ 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
+ {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
+ {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
+ {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
+ {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
+ {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
+ 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
+ {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
+ {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
+ {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
+ {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
+ {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
+ 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
+ {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
+ {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
+ {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
+ {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
+ 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
+ {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
+ {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
+ 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
+ {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
+ 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
+ {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
+ {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
+ {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
+ {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
+ 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
+ {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
+ 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
+ {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
+ {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
+ 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
+ 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
+ {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
+ {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
+ {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
+ {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
+ {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
+ {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
+ {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
+ {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
+ {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
+ 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
+ {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
+ {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
+ 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
+ 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
+ {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
+ {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
+ {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
+ 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
+ {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
+ {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
+ 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
+ {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
+ {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
+ {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
+ {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
+ {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
+ 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
+ {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
+ {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
+ {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
+ {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
+ {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
+ {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
+ {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
+ {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
+ {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
+ {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
+ {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
+ {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
+ {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
+ {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
+ {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
+ {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
+ {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
+ 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
+ {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
+ {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
+ {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
+ {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
+ {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
+ 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
+ {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
+ {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
+ {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
+ 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
+ {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
+ {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
+ 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
+ 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
+ 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
+ {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
+ {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
+ 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
+ {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
+ {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
+ {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
+ 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
+ {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
+ {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
+ {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
+ 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
+ {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
+ {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
+ {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
+ 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
+ {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
+ 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
+ {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
+ {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
+ {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
+ {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
+ {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
+ {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
+ 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
+ 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
+ {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
+ 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
+ {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
+ {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
+ {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
+ 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
+ {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
+ {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
+ {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
+ {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
+ {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
+ {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
+ {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
+ {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
+ {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
+ {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
+ {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
+ {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
+ 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
+ {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
+ {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
+ {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
+ {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
+ 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
+ {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
+ {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
+ {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
+ {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
+ {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
+ {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
+ {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
+ {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
+ {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
+ 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
+ {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
+ {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
+ 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
+ {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
+ {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
+ 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
+ {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
+ {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
+ {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
+ {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
+ 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
+ {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
+ {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
+ {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
+ {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
+ {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
+ {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
+ {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
+ {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
+ {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
+ 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
+ {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
+ {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
+ {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
+ {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
+ {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
+ {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
+ {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
+ {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
+ {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
+ {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
+ {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
+ {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
+ {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
+ {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
+ {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
+ {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
+ 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
+ {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
+ {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
+ 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
+ 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
+ {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
+ 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
+ {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
+ {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
+ 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
+ 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
+ {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
+ {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
+ 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
+ {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
+ {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
+ {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
+ {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
+ {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
+ {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
+ {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
+ 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
+ {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
+ {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
+ {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
+ {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
+ {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
+ 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
+ {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
+ 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
+ {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
+ {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
+ 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
+ {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
+ {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
+ 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
+ {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
+ {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
+ 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
+ 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
+ {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
+ {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
+ 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
+ {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
+ {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
+ {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
+ {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
+ {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
+ {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
+ 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
+ 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
+ {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
+ {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
+ {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
+ {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
+ {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
+ 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
+ {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
+ 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
+ {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
+ 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
+ {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
+ {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
+ {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
+ {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
+ {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
+ {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
+ 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
+ {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
+ {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
+ {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
+ {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
+ {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
+ {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
+ {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
+ {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
+ {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
+ 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
+ {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
+ {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
+ {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
+ 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
+ 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
+ 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
+ {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
+ {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
+ {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
+ {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
+ {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
+ {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
+ {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
+ {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
+ {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
+ {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
+ {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
+ {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
+ {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
+ 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
+ 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
+ {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
+ 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
+ {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
+ 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
+ {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
+ {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
+ {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
+ {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
+ {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
+ {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
+ {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
+ {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
+ {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
+ {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
+ {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
+ {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
+ {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
+ {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
+ 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
+ {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
+ {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
+ {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
+ {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
+ {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
+ {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
+ {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
+ {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
+ {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
+ {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
+ {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
+ {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
+ 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
+ {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
+ {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
+ 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
+ {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
+ {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
+ {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
+ 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
+ {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
+ {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
+ {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
+ 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
+ {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
+ {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
+ {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
+ {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
+ {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
+ {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
+ 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
+ {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
+ {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
+ 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
+ {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
+ {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
+ {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
+ {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
+ {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
+ {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
+ 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
+ {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
+ {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
+ {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
+ {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
+ {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
+ 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
+ {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
+ {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
+ {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
+ {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
+ {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
+ 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
+ {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
+ {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
+ {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
+ {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
+ {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
+ {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
+ {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
+ {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
+ {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
+ {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
+ {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
+ {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
+ {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
+ {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
+ {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
+ {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
+ {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
+ {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
+ {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
+ {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
+ {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
+ 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
+ {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
+ {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
+ {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
+ {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
+ 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
+ {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
+ {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
+ 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
+ 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
+ {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
+ {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
+ {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
+ {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
+ {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
+ 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
+ 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
+ {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
+ {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
+ {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
+ {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
+ {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
+ {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
+ {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
+ {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
+ 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
+ {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
+ {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
+ {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
+ {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
+ {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
+ {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
+ {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
+ 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
+ {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
+ {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
+ {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
+ {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
+ 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
+ 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
+ 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
+ {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
+ {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
+ {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
+ {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
+ {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
+ {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
+ {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
+ {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
+ 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
+ {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
+ {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
+ {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
+ 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
+ {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
+ 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
+ {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
+ {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
+ 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
+ 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
+ {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
+ {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
+ 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
+ {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
+ {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
+ 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
+ {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
+ 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
+ {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
+ {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
+ {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
+ 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
+ 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
+ {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
+ {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
+ {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
+ {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
+ {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
+ {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
+ {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
+ {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
+ 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
+ {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
+ 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
+ {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
+ {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
+ {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
+ {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
+ 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
+ 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
+ {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
+ {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
+ {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
+ {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
+ {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
+ {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
+ {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
+ {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
+ 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
+ {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
+ {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
+ {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
+ {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
+ {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
+ {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
+ 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
+ {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
+ {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
+ {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
+ 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
+ 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
+ {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
+ {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
+ {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
+ {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
+ {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
+ {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
+ {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
+ {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
+ 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
+ {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
+ 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
+ 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
+ {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
+ 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
+ {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
+ {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
+ {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
+ {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
+ {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
+ 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
+ {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
+ {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
+ {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
+ {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
+ {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
+ {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
+ {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
+ {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
+ {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
+ 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
+ {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
+ {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
+ {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
+ 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
+ {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
+ 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
+ {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
+ {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
+ {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
+ {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
+ {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
+ {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
+ {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
+ {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
+ 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
+ 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
+ {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
+ {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
+ {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
+ {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
+ 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
+ {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
+ {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
+ 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
+ {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
+ {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
+ {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
+ {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
+ {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
+ {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
+ 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
+ {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
+ {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
+ {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
+ {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
+ {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
+ {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
+ {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
+ {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
+ {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
+ 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
+ {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
+ {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
+ {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
+ 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
+ {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
+ {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
+ {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
+ 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
+ {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
+ {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
+ {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
+ {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
+ {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
+ {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
+ {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
+ {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
+ 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
+ {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
+ {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
+ {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
+ {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
+ {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
+ 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
+ {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
+ {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
+ {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
+ 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
+ {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
+ {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
+ {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
+ {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
+ {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
+ {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
+ {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
+ {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
+ [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
+ 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
+ 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
+ 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
+ {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
+ 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
+ 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
+ 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
+ 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
+ {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
+ {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
+ {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
+ {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
+ {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
+ {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
+ {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
+ {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
+ {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
+ {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
+ {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
+ {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
+ {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
+ {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
+ {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
+ {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
+ {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
+ {f: 7, c: 19887}]
+};
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/colorspace.js b/apps/files_pdfviewer/js/pdfjs/src/colorspace.js
new file mode 100755
index 00000000000..b369d0f884f
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/colorspace.js
@@ -0,0 +1,411 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ColorSpace = (function colorSpaceColorSpace() {
+ // Constructor should define this.numComps, this.defaultColor, this.name
+ function constructor() {
+ error('should not call ColorSpace constructor');
+ }
+
+ constructor.prototype = {
+ // Input: array of size numComps representing color component values
+ // Output: array of rgb values, each value ranging from [0.1]
+ getRgb: function colorSpaceGetRgb(color) {
+ error('Should not call ColorSpace.getRgb: ' + color);
+ },
+ // Input: Uint8Array of component values, each value scaled to [0,255]
+ // Output: Uint8Array of rgb values, each value scaled to [0,255]
+ getRgbBuffer: function colorSpaceGetRgbBuffer(input) {
+ error('Should not call ColorSpace.getRgbBuffer: ' + input);
+ }
+ };
+
+ constructor.parse = function colorSpaceParse(cs, xref, res) {
+ var IR = constructor.parseToIR(cs, xref, res);
+ if (IR instanceof AlternateCS)
+ return IR;
+
+ return constructor.fromIR(IR);
+ };
+
+ constructor.fromIR = function colorSpaceFromIR(IR) {
+ var name = isArray(IR) ? IR[0] : IR;
+
+ switch (name) {
+ case 'DeviceGrayCS':
+ return new DeviceGrayCS();
+ case 'DeviceRgbCS':
+ return new DeviceRgbCS();
+ case 'DeviceCmykCS':
+ return new DeviceCmykCS();
+ case 'PatternCS':
+ var basePatternCS = IR[1];
+ if (basePatternCS)
+ basePatternCS = ColorSpace.fromIR(basePatternCS);
+ return new PatternCS(basePatternCS);
+ case 'IndexedCS':
+ var baseIndexedCS = IR[1];
+ var hiVal = IR[2];
+ var lookup = IR[3];
+ return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+ case 'AlternateCS':
+ var numComps = IR[1];
+ var alt = IR[2];
+ var tintFnIR = IR[3];
+
+ return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+ PDFFunction.fromIR(tintFnIR));
+ default:
+ error('Unkown name ' + name);
+ }
+ return null;
+ };
+
+ constructor.parseToIR = function colorSpaceParseToIR(cs, xref, res) {
+ if (isName(cs)) {
+ var colorSpaces = xref.fetchIfRef(res.get('ColorSpace'));
+ if (isDict(colorSpaces)) {
+ var refcs = colorSpaces.get(cs.name);
+ if (refcs)
+ cs = refcs;
+ }
+ }
+
+ cs = xref.fetchIfRef(cs);
+ var mode;
+
+ if (isName(cs)) {
+ mode = cs.name;
+ this.mode = mode;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'Pattern':
+ return ['PatternCS', null];
+ default:
+ error('unrecognized colorspace ' + mode);
+ }
+ } else if (isArray(cs)) {
+ mode = cs[0].name;
+ this.mode = mode;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'CalGray':
+ return 'DeviceGrayCS';
+ case 'CalRGB':
+ return 'DeviceRgbCS';
+ case 'ICCBased':
+ var stream = xref.fetchIfRef(cs[1]);
+ var dict = stream.dict;
+ var numComps = dict.get('N');
+ if (numComps == 1)
+ return 'DeviceGrayCS';
+ if (numComps == 3)
+ return 'DeviceRgbCS';
+ if (numComps == 4)
+ return 'DeviceCmykCS';
+ break;
+ case 'Pattern':
+ var basePatternCS = cs[1];
+ if (basePatternCS)
+ basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+ return ['PatternCS', basePatternCS];
+ case 'Indexed':
+ var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+ var hiVal = cs[2] + 1;
+ var lookup = xref.fetchIfRef(cs[3]);
+ return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+ case 'Separation':
+ case 'DeviceN':
+ var name = cs[1];
+ var numComps = 1;
+ if (isName(name))
+ numComps = 1;
+ else if (isArray(name))
+ numComps = name.length;
+ var alt = ColorSpace.parseToIR(cs[2], xref, res);
+ var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+ return ['AlternateCS', numComps, alt, tintFnIR];
+ case 'Lab':
+ default:
+ error('unimplemented color space object "' + mode + '"');
+ }
+ } else {
+ error('unrecognized color space object: "' + cs + '"');
+ }
+ return null;
+ };
+
+ return constructor;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces. A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function alternateCS() {
+ function constructor(numComps, base, tintFn) {
+ this.name = 'Alternate';
+ this.numComps = numComps;
+ this.defaultColor = [];
+ for (var i = 0; i < numComps; ++i)
+ this.defaultColor.push(1);
+ this.base = base;
+ this.tintFn = tintFn;
+ }
+
+ constructor.prototype = {
+ getRgb: function altcs_getRgb(color) {
+ var tinted = this.tintFn(color);
+ return this.base.getRgb(tinted);
+ },
+ getRgbBuffer: function altcs_getRgbBuffer(input, bits) {
+ var tintFn = this.tintFn;
+ var base = this.base;
+ var scale = 1 / ((1 << bits) - 1);
+ var length = input.length;
+ var pos = 0;
+ var baseNumComps = base.numComps;
+ var baseBuf = new Uint8Array(baseNumComps * length);
+ var numComps = this.numComps;
+ var scaled = new Array(numComps);
+
+ for (var i = 0; i < length; i += numComps) {
+ for (var z = 0; z < numComps; ++z)
+ scaled[z] = input[i + z] * scale;
+
+ var tinted = tintFn(scaled);
+ for (var j = 0; j < baseNumComps; ++j)
+ baseBuf[pos++] = 255 * tinted[j];
+ }
+ return base.getRgbBuffer(baseBuf, 8);
+ }
+ };
+
+ return constructor;
+})();
+
+var PatternCS = (function patternCS() {
+ function constructor(baseCS) {
+ this.name = 'Pattern';
+ this.base = baseCS;
+ }
+ constructor.prototype = {};
+
+ return constructor;
+})();
+
+var IndexedCS = (function indexedCS() {
+ function constructor(base, highVal, lookup) {
+ this.name = 'Indexed';
+ this.numComps = 1;
+ this.defaultColor = [0];
+ this.base = base;
+ this.highVal = highVal;
+
+ var baseNumComps = base.numComps;
+ var length = baseNumComps * highVal;
+ var lookupArray = new Uint8Array(length);
+
+ if (isStream(lookup)) {
+ var bytes = lookup.getBytes(length);
+ lookupArray.set(bytes);
+ } else if (isString(lookup)) {
+ for (var i = 0; i < length; ++i)
+ lookupArray[i] = lookup.charCodeAt(i);
+ } else {
+ error('Unrecognized lookup table: ' + lookup);
+ }
+ this.lookup = lookupArray;
+ }
+
+ constructor.prototype = {
+ getRgb: function indexcs_getRgb(color) {
+ var numComps = this.base.numComps;
+ var start = color[0] * numComps;
+ var c = [];
+
+ for (var i = start, ii = start + numComps; i < ii; ++i)
+ c.push(this.lookup[i]);
+
+ return this.base.getRgb(c);
+ },
+ getRgbBuffer: function indexcs_getRgbBuffer(input) {
+ var base = this.base;
+ var numComps = base.numComps;
+ var lookup = this.lookup;
+ var length = input.length;
+ var baseBuf = new Uint8Array(length * numComps);
+ var baseBufPos = 0;
+
+ for (var i = 0; i < length; ++i) {
+ var lookupPos = input[i] * numComps;
+ for (var j = 0; j < numComps; ++j) {
+ baseBuf[baseBufPos++] = lookup[lookupPos + j];
+ }
+ }
+
+ return base.getRgbBuffer(baseBuf, 8);
+ }
+ };
+ return constructor;
+})();
+
+var DeviceGrayCS = (function deviceGrayCS() {
+ function constructor() {
+ this.name = 'DeviceGray';
+ this.numComps = 1;
+ this.defaultColor = [0];
+ }
+
+ constructor.prototype = {
+ getRgb: function graycs_getRgb(color) {
+ var c = color[0];
+ return [c, c, c];
+ },
+ getRgbBuffer: function graycs_getRgbBuffer(input, bits) {
+ var scale = 255 / ((1 << bits) - 1);
+ var length = input.length;
+ var rgbBuf = new Uint8Array(length * 3);
+ for (var i = 0, j = 0; i < length; ++i) {
+ var c = (scale * input[i]) | 0;
+ rgbBuf[j++] = c;
+ rgbBuf[j++] = c;
+ rgbBuf[j++] = c;
+ }
+ return rgbBuf;
+ }
+ };
+ return constructor;
+})();
+
+var DeviceRgbCS = (function deviceRgbCS() {
+ function constructor() {
+ this.name = 'DeviceRGB';
+ this.numComps = 3;
+ this.defaultColor = [0, 0, 0];
+ }
+ constructor.prototype = {
+ getRgb: function rgbcs_getRgb(color) {
+ return color;
+ },
+ getRgbBuffer: function rgbcs_getRgbBuffer(input, bits) {
+ if (bits == 8)
+ return input;
+ var scale = 255 / ((1 << bits) - 1);
+ var i, length = input.length;
+ var rgbBuf = new Uint8Array(length);
+ for (i = 0; i < length; ++i)
+ rgbBuf[i] = (scale * input[i]) | 0;
+ return rgbBuf;
+ }
+ };
+ return constructor;
+})();
+
+var DeviceCmykCS = (function deviceCmykCS() {
+ function constructor() {
+ this.name = 'DeviceCMYK';
+ this.numComps = 4;
+ this.defaultColor = [0, 0, 0, 1];
+ }
+ constructor.prototype = {
+ getRgb: function cmykcs_getRgb(color) {
+ var c = color[0], m = color[1], y = color[2], k = color[3];
+ var c1 = 1 - c, m1 = 1 - m, y1 = 1 - y, k1 = 1 - k;
+
+ var x, r, g, b;
+ // this is a matrix multiplication, unrolled for performance
+ // code is taken from the poppler implementation
+ x = c1 * m1 * y1 * k1; // 0 0 0 0
+ r = g = b = x;
+ x = c1 * m1 * y1 * k; // 0 0 0 1
+ r += 0.1373 * x;
+ g += 0.1216 * x;
+ b += 0.1255 * x;
+ x = c1 * m1 * y * k1; // 0 0 1 0
+ r += x;
+ g += 0.9490 * x;
+ x = c1 * m1 * y * k; // 0 0 1 1
+ r += 0.1098 * x;
+ g += 0.1020 * x;
+ x = c1 * m * y1 * k1; // 0 1 0 0
+ r += 0.9255 * x;
+ b += 0.5490 * x;
+ x = c1 * m * y1 * k; // 0 1 0 1
+ r += 0.1412 * x;
+ x = c1 * m * y * k1; // 0 1 1 0
+ r += 0.9294 * x;
+ g += 0.1098 * x;
+ b += 0.1412 * x;
+ x = c1 * m * y * k; // 0 1 1 1
+ r += 0.1333 * x;
+ x = c * m1 * y1 * k1; // 1 0 0 0
+ g += 0.6784 * x;
+ b += 0.9373 * x;
+ x = c * m1 * y1 * k; // 1 0 0 1
+ g += 0.0588 * x;
+ b += 0.1412 * x;
+ x = c * m1 * y * k1; // 1 0 1 0
+ g += 0.6510 * x;
+ b += 0.3137 * x;
+ x = c * m1 * y * k; // 1 0 1 1
+ g += 0.0745 * x;
+ x = c * m * y1 * k1; // 1 1 0 0
+ r += 0.1804 * x;
+ g += 0.1922 * x;
+ b += 0.5725 * x;
+ x = c * m * y1 * k; // 1 1 0 1
+ b += 0.0078 * x;
+ x = c * m * y * k1; // 1 1 1 0
+ r += 0.2118 * x;
+ g += 0.2119 * x;
+ b += 0.2235 * x;
+
+ return [r, g, b];
+ },
+ getRgbBuffer: function cmykcs_getRgbBuffer(colorBuf, bits) {
+ var scale = 1 / ((1 << bits) - 1);
+ var length = colorBuf.length / 4;
+ var rgbBuf = new Uint8Array(length * 3);
+ var rgbBufPos = 0;
+ var colorBufPos = 0;
+
+ for (var i = 0; i < length; i++) {
+ var cmyk = [];
+ for (var j = 0; j < 4; ++j)
+ cmyk.push(scale * colorBuf[colorBufPos++]);
+
+ var rgb = this.getRgb(cmyk);
+ for (var j = 0; j < 3; ++j)
+ rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
+ }
+
+ return rgbBuf;
+ }
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/core.js b/apps/files_pdfviewer/js/pdfjs/src/core.js
new file mode 100755
index 00000000000..3549eb906b6
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/core.js
@@ -0,0 +1,652 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var ERRORS = 0, WARNINGS = 1, TODOS = 5;
+var verbosity = WARNINGS;
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+ globalScope.PDFJS = {};
+}
+
+// getPdf()
+// Convenience function to perform binary Ajax GET
+// Usage: getPdf('http://...', callback)
+// getPdf({
+// url:String ,
+// [,progress:Function, error:Function]
+// },
+// callback)
+function getPdf(arg, callback) {
+ var params = arg;
+ if (typeof arg === 'string')
+ params = { url: arg };
+
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', params.url);
+ xhr.mozResponseType = xhr.responseType = 'arraybuffer';
+ xhr.expected = (document.URL.indexOf('file:') === 0) ? 0 : 200;
+
+ if ('progress' in params)
+ xhr.onprogress = params.progress || undefined;
+
+ if ('error' in params)
+ xhr.onerror = params.error || undefined;
+
+ xhr.onreadystatechange = function getPdfOnreadystatechange() {
+ if (xhr.readyState === 4 && xhr.status === xhr.expected) {
+ var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
+ xhr.responseArrayBuffer || xhr.response);
+ callback(data);
+ }
+ };
+ xhr.send(null);
+}
+globalScope.PDFJS.getPdf = getPdf;
+
+var Page = (function pagePage() {
+ function constructor(xref, pageNumber, pageDict, ref) {
+ this.pageNumber = pageNumber;
+ this.pageDict = pageDict;
+ this.stats = {
+ create: Date.now(),
+ compile: 0.0,
+ fonts: 0.0,
+ images: 0.0,
+ render: 0.0
+ };
+ this.xref = xref;
+ this.ref = ref;
+ }
+
+ constructor.prototype = {
+ getPageProp: function pageGetPageProp(key) {
+ return this.xref.fetchIfRef(this.pageDict.get(key));
+ },
+ inheritPageProp: function pageInheritPageProp(key) {
+ var dict = this.pageDict;
+ var obj = dict.get(key);
+ while (obj === undefined) {
+ dict = this.xref.fetchIfRef(dict.get('Parent'));
+ if (!dict)
+ break;
+ obj = dict.get(key);
+ }
+ return obj;
+ },
+ get content() {
+ return shadow(this, 'content', this.getPageProp('Contents'));
+ },
+ get resources() {
+ return shadow(this, 'resources', this.inheritPageProp('Resources'));
+ },
+ get mediaBox() {
+ var obj = this.inheritPageProp('MediaBox');
+ // Reset invalid media box to letter size.
+ if (!isArray(obj) || obj.length !== 4)
+ obj = [0, 0, 612, 792];
+ return shadow(this, 'mediaBox', obj);
+ },
+ get view() {
+ var obj = this.inheritPageProp('CropBox');
+ var view = {
+ x: 0,
+ y: 0,
+ width: this.width,
+ height: this.height
+ };
+ if (isArray(obj) && obj.length == 4) {
+ var tl = this.rotatePoint(obj[0], obj[1]);
+ var br = this.rotatePoint(obj[2], obj[3]);
+ view.x = Math.min(tl.x, br.x);
+ view.y = Math.min(tl.y, br.y);
+ view.width = Math.abs(tl.x - br.x);
+ view.height = Math.abs(tl.y - br.y);
+ }
+
+ return shadow(this, 'cropBox', view);
+ },
+ get annotations() {
+ return shadow(this, 'annotations', this.inheritPageProp('Annots'));
+ },
+ get width() {
+ var mediaBox = this.mediaBox;
+ var rotate = this.rotate;
+ var width;
+ if (rotate == 0 || rotate == 180) {
+ width = (mediaBox[2] - mediaBox[0]);
+ } else {
+ width = (mediaBox[3] - mediaBox[1]);
+ }
+ return shadow(this, 'width', width);
+ },
+ get height() {
+ var mediaBox = this.mediaBox;
+ var rotate = this.rotate;
+ var height;
+ if (rotate == 0 || rotate == 180) {
+ height = (mediaBox[3] - mediaBox[1]);
+ } else {
+ height = (mediaBox[2] - mediaBox[0]);
+ }
+ return shadow(this, 'height', height);
+ },
+ get rotate() {
+ var rotate = this.inheritPageProp('Rotate') || 0;
+ // Normalize rotation so it's a multiple of 90 and between 0 and 270
+ if (rotate % 90 != 0) {
+ rotate = 0;
+ } else if (rotate >= 360) {
+ rotate = rotate % 360;
+ } else if (rotate < 0) {
+ // The spec doesn't cover negatives, assume its counterclockwise
+ // rotation. The following is the other implementation of modulo.
+ rotate = ((rotate % 360) + 360) % 360;
+ }
+ return shadow(this, 'rotate', rotate);
+ },
+
+ startRenderingFromIRQueue: function pageStartRenderingFromIRQueue(
+ IRQueue, fonts) {
+ var self = this;
+ this.IRQueue = IRQueue;
+ var gfx = new CanvasGraphics(this.ctx, this.objs);
+
+ var displayContinuation = function pageDisplayContinuation() {
+ // Always defer call to display() to work around bug in
+ // Firefox error reporting from XHR callbacks.
+ setTimeout(function pageSetTimeout() {
+ try {
+ self.display(gfx, self.callback);
+ } catch (e) {
+ if (self.callback) self.callback(e.toString());
+ throw e;
+ }
+ });
+ };
+
+ this.ensureFonts(fonts,
+ function pageStartRenderingFromIRQueueEnsureFonts() {
+ displayContinuation();
+ });
+ },
+
+ getIRQueue: function pageGetIRQueue(handler, dependency) {
+ if (this.IRQueue) {
+ // content was compiled
+ return this.IRQueue;
+ }
+
+ var xref = this.xref;
+ var content = xref.fetchIfRef(this.content);
+ var resources = xref.fetchIfRef(this.resources);
+ if (isArray(content)) {
+ // fetching items
+ var i, n = content.length;
+ for (i = 0; i < n; ++i)
+ content[i] = xref.fetchIfRef(content[i]);
+ content = new StreamsSequenceStream(content);
+ }
+
+ var pe = this.pe = new PartialEvaluator(
+ xref, handler, 'p' + this.pageNumber + '_');
+ var IRQueue = {};
+ return (this.IRQueue = pe.getIRQueue(content, resources, IRQueue,
+ dependency));
+ },
+
+ ensureFonts: function pageEnsureFonts(fonts, callback) {
+ // Convert the font names to the corresponding font obj.
+ for (var i = 0, ii = fonts.length; i < ii; i++) {
+ fonts[i] = this.objs.objs[fonts[i]].data;
+ }
+
+ // Load all the fonts
+ var fontObjs = FontLoader.bind(
+ fonts,
+ function pageEnsureFontsFontObjs(fontObjs) {
+ this.stats.fonts = Date.now();
+
+ callback.call(this);
+ }.bind(this),
+ this.objs
+ );
+ },
+
+ display: function pageDisplay(gfx, callback) {
+ var xref = this.xref;
+ var resources = xref.fetchIfRef(this.resources);
+ var mediaBox = xref.fetchIfRef(this.mediaBox);
+ assertWellFormed(isDict(resources), 'invalid page resources');
+
+ gfx.xref = xref;
+ gfx.res = resources;
+ gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1],
+ width: this.width,
+ height: this.height,
+ rotate: this.rotate });
+
+ var startIdx = 0;
+ var length = this.IRQueue.fnArray.length;
+ var IRQueue = this.IRQueue;
+
+ var self = this;
+ function next() {
+ startIdx = gfx.executeIRQueue(IRQueue, startIdx, next);
+ if (startIdx == length) {
+ self.stats.render = Date.now();
+ if (callback) callback();
+ }
+ }
+ next();
+ },
+ rotatePoint: function pageRotatePoint(x, y, reverse) {
+ var rotate = reverse ? (360 - this.rotate) : this.rotate;
+ switch (rotate) {
+ case 180:
+ return {x: this.width - x, y: y};
+ case 90:
+ return {x: this.width - y, y: this.height - x};
+ case 270:
+ return {x: y, y: x};
+ case 360:
+ case 0:
+ default:
+ return {x: x, y: this.height - y};
+ }
+ },
+ getLinks: function pageGetLinks() {
+ var xref = this.xref;
+ var annotations = xref.fetchIfRef(this.annotations) || [];
+ var i, n = annotations.length;
+ var links = [];
+ for (i = 0; i < n; ++i) {
+ var annotation = xref.fetch(annotations[i]);
+ if (!isDict(annotation))
+ continue;
+ var subtype = annotation.get('Subtype');
+ if (!isName(subtype) || subtype.name != 'Link')
+ continue;
+ var rect = annotation.get('Rect');
+ var topLeftCorner = this.rotatePoint(rect[0], rect[1]);
+ var bottomRightCorner = this.rotatePoint(rect[2], rect[3]);
+
+ var link = {};
+ link.x = Math.min(topLeftCorner.x, bottomRightCorner.x);
+ link.y = Math.min(topLeftCorner.y, bottomRightCorner.y);
+ link.width = Math.abs(topLeftCorner.x - bottomRightCorner.x);
+ link.height = Math.abs(topLeftCorner.y - bottomRightCorner.y);
+ var a = this.xref.fetchIfRef(annotation.get('A'));
+ if (a) {
+ switch (a.get('S').name) {
+ case 'URI':
+ link.url = a.get('URI');
+ break;
+ case 'GoTo':
+ link.dest = a.get('D');
+ break;
+ default:
+ TODO('other link types');
+ }
+ } else if (annotation.has('Dest')) {
+ // simple destination link
+ var dest = annotation.get('Dest');
+ link.dest = isName(dest) ? dest.name : dest;
+ }
+ links.push(link);
+ }
+ return links;
+ },
+ startRendering: function pageStartRendering(ctx, callback) {
+ this.ctx = ctx;
+ this.callback = callback;
+
+ this.startRenderingTime = Date.now();
+ this.pdf.startRendering(this);
+ }
+ };
+
+ return constructor;
+})();
+
+/**
+ * The `PDFDocModel` holds all the data of the PDF file. Compared to the
+ * `PDFDoc`, this one doesn't have any job management code.
+ * Right now there exists one PDFDocModel on the main thread + one object
+ * for each worker. If there is no worker support enabled, there are two
+ * `PDFDocModel` objects on the main thread created.
+ * TODO: Refactor the internal object structure, such that there is no
+ * need for the `PDFDocModel` anymore and there is only one object on the
+ * main thread and not one entire copy on each worker instance.
+ */
+var PDFDocModel = (function pdfDoc() {
+ function constructor(arg, callback) {
+ if (isStream(arg))
+ init.call(this, arg);
+ else if (isArrayBuffer(arg))
+ init.call(this, new Stream(arg));
+ else
+ error('PDFDocModel: Unknown argument type');
+ }
+
+ function init(stream) {
+ assertWellFormed(stream.length > 0, 'stream must have data');
+ this.stream = stream;
+ this.setup();
+ }
+
+ function find(stream, needle, limit, backwards) {
+ var pos = stream.pos;
+ var end = stream.end;
+ var str = '';
+ if (pos + limit > end)
+ limit = end - pos;
+ for (var n = 0; n < limit; ++n)
+ str += stream.getChar();
+ stream.pos = pos;
+ var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+ if (index == -1)
+ return false; /* not found */
+ stream.pos += index;
+ return true; /* found */
+ }
+
+ constructor.prototype = {
+ get linearization() {
+ var length = this.stream.length;
+ var linearization = false;
+ if (length) {
+ linearization = new Linearization(this.stream);
+ if (linearization.length != length)
+ linearization = false;
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'linearization', linearization);
+ },
+ get startXRef() {
+ var stream = this.stream;
+ var startXRef = 0;
+ var linearization = this.linearization;
+ if (linearization) {
+ // Find end of first obj.
+ stream.reset();
+ if (find(stream, 'endobj', 1024))
+ startXRef = stream.pos + 6;
+ } else {
+ // Find startxref at the end of the file.
+ var start = stream.end - 1024;
+ if (start < 0)
+ start = 0;
+ stream.pos = start;
+ if (find(stream, 'startxref', 1024, true)) {
+ stream.skip(9);
+ var ch;
+ do {
+ ch = stream.getChar();
+ } while (Lexer.isSpace(ch));
+ var str = '';
+ while ((ch - '0') <= 9) {
+ str += ch;
+ ch = stream.getChar();
+ }
+ startXRef = parseInt(str, 10);
+ if (isNaN(startXRef))
+ startXRef = 0;
+ }
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'startXRef', startXRef);
+ },
+ get mainXRefEntriesOffset() {
+ var mainXRefEntriesOffset = 0;
+ var linearization = this.linearization;
+ if (linearization)
+ mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
+ // shadow the prototype getter with a data property
+ return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
+ },
+ // Find the header, remove leading garbage and setup the stream
+ // starting from the header.
+ checkHeader: function pdfDocCheckHeader() {
+ var stream = this.stream;
+ stream.reset();
+ if (find(stream, '%PDF-', 1024)) {
+ // Found the header, trim off any garbage before it.
+ stream.moveStart();
+ return;
+ }
+ // May not be a PDF file, continue anyway.
+ },
+ setup: function pdfDocSetup(ownerPassword, userPassword) {
+ this.checkHeader();
+ this.xref = new XRef(this.stream,
+ this.startXRef,
+ this.mainXRefEntriesOffset);
+ this.catalog = new Catalog(this.xref);
+ },
+ get numPages() {
+ var linearization = this.linearization;
+ var num = linearization ? linearization.numPages : this.catalog.numPages;
+ // shadow the prototype getter
+ return shadow(this, 'numPages', num);
+ },
+ getPage: function pdfDocGetPage(n) {
+ return this.catalog.getPage(n);
+ }
+ };
+
+ return constructor;
+})();
+
+var PDFDoc = (function pdfDoc() {
+ function constructor(arg, callback) {
+ var stream = null;
+ var data = null;
+
+ if (isStream(arg)) {
+ stream = arg;
+ data = arg.bytes;
+ } else if (isArrayBuffer(arg)) {
+ stream = new Stream(arg);
+ data = arg;
+ } else {
+ error('PDFDoc: Unknown argument type');
+ }
+
+ this.data = data;
+ this.stream = stream;
+ this.pdf = new PDFDocModel(stream);
+
+ this.catalog = this.pdf.catalog;
+ this.objs = new PDFObjects();
+
+ this.pageCache = [];
+ this.fontsLoading = {};
+ this.workerReadyPromise = new Promise('workerReady');
+
+ // If worker support isn't disabled explicit and the browser has worker
+ // support, create a new web worker and test if it/the browser fullfills
+ // all requirements to run parts of pdf.js in a web worker.
+ // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+ // as it arrives on the worker. Chrome added this with version 15.
+ if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
+ var workerSrc = PDFJS.workerSrc;
+ if (typeof workerSrc === 'undefined') {
+ throw 'No PDFJS.workerSrc specified';
+ }
+
+ var worker;
+ try {
+ worker = new Worker(workerSrc);
+ } catch (e) {
+ // Some versions of FF can't create a worker on localhost, see:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+ globalScope.PDFJS.disableWorker = true;
+ this.setupFakeWorker();
+ return;
+ }
+
+ var messageHandler = new MessageHandler('main', worker);
+
+ // Tell the worker the file it was created from.
+ messageHandler.send('workerSrc', workerSrc);
+
+ messageHandler.on('test', function pdfDocTest(supportTypedArray) {
+ if (supportTypedArray) {
+ this.worker = worker;
+ this.setupMessageHandler(messageHandler);
+ } else {
+ this.setupFakeWorker();
+ }
+ }.bind(this));
+
+ var testObj = new Uint8Array(1);
+ messageHandler.send('test', testObj);
+ } else {
+ this.setupFakeWorker();
+ }
+ }
+
+ constructor.prototype = {
+ setupFakeWorker: function() {
+ // If we don't use a worker, just post/sendMessage to the main thread.
+ var fakeWorker = {
+ postMessage: function pdfDocPostMessage(obj) {
+ fakeWorker.onmessage({data: obj});
+ },
+ terminate: function pdfDocTerminate() {}
+ };
+
+ var messageHandler = new MessageHandler('main', fakeWorker);
+ this.setupMessageHandler(messageHandler);
+
+ // If the main thread is our worker, setup the handling for the messages
+ // the main thread sends to it self.
+ WorkerMessageHandler.setup(messageHandler);
+ },
+
+
+ setupMessageHandler: function(messageHandler) {
+ this.messageHandler = messageHandler;
+
+ messageHandler.on('page', function pdfDocPage(data) {
+ var pageNum = data.pageNum;
+ var page = this.pageCache[pageNum];
+ var depFonts = data.depFonts;
+
+ page.startRenderingFromIRQueue(data.IRQueue, depFonts);
+ }, this);
+
+ messageHandler.on('obj', function pdfDocObj(data) {
+ var id = data[0];
+ var type = data[1];
+
+ switch (type) {
+ case 'JpegStream':
+ var IR = data[2];
+ new JpegImageLoader(id, IR, this.objs);
+ break;
+ case 'Font':
+ var name = data[2];
+ var file = data[3];
+ var properties = data[4];
+
+ if (file) {
+ var fontFileDict = new Dict();
+ fontFileDict.map = file.dict.map;
+
+ var fontFile = new Stream(file.bytes, file.start,
+ file.end - file.start, fontFileDict);
+
+ // Check if this is a FlateStream. Otherwise just use the created
+ // Stream one. This makes complex_ttf_font.pdf work.
+ var cmf = file.bytes[0];
+ if ((cmf & 0x0f) == 0x08) {
+ file = new FlateStream(fontFile);
+ } else {
+ file = fontFile;
+ }
+ }
+
+ // For now, resolve the font object here direclty. The real font
+ // object is then created in FontLoader.bind().
+ this.objs.resolve(id, {
+ name: name,
+ file: file,
+ properties: properties
+ });
+ break;
+ default:
+ throw 'Got unkown object type ' + type;
+ }
+ }, this);
+
+ messageHandler.on('font_ready', function pdfDocFontReady(data) {
+ var id = data[0];
+ var font = new FontShape(data[1]);
+
+ // If there is no string, then there is nothing to attach to the DOM.
+ if (!font.str) {
+ this.objs.resolve(id, font);
+ } else {
+ this.objs.setData(id, font);
+ }
+ }.bind(this));
+
+ setTimeout(function pdfDocFontReadySetTimeout() {
+ messageHandler.send('doc', this.data);
+ this.workerReadyPromise.resolve(true);
+ }.bind(this));
+ },
+
+ get numPages() {
+ return this.pdf.numPages;
+ },
+
+ startRendering: function pdfDocStartRendering(page) {
+ // The worker might not be ready to receive the page request yet.
+ this.workerReadyPromise.then(function pdfDocStartRenderingThen() {
+ this.messageHandler.send('page_request', page.pageNumber + 1);
+ }.bind(this));
+ },
+
+ getPage: function pdfDocGetPage(n) {
+ if (this.pageCache[n])
+ return this.pageCache[n];
+
+ var page = this.pdf.getPage(n);
+ // Add a reference to the objects such that Page can forward the reference
+ // to the CanvasGraphics and so on.
+ page.objs = this.objs;
+ page.pdf = this;
+ return (this.pageCache[n] = page);
+ },
+
+ destroy: function pdfDocDestroy() {
+ if (this.worker)
+ this.worker.terminate();
+
+ if (this.fontWorker)
+ this.fontWorker.terminate();
+
+ for (var n in this.pageCache)
+ delete this.pageCache[n];
+
+ delete this.data;
+ delete this.stream;
+ delete this.pdf;
+ delete this.catalog;
+ }
+ };
+
+ return constructor;
+})();
+
+globalScope.PDFJS.PDFDoc = PDFDoc;
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/crypto.js b/apps/files_pdfviewer/js/pdfjs/src/crypto.js
new file mode 100755
index 00000000000..95559864483
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/crypto.js
@@ -0,0 +1,597 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ARCFourCipher = (function arcFourCipher() {
+ function constructor(key) {
+ this.a = 0;
+ this.b = 0;
+ var s = new Uint8Array(256);
+ var i, j = 0, tmp, keyLength = key.length;
+ for (i = 0; i < 256; ++i)
+ s[i] = i;
+ for (i = 0; i < 256; ++i) {
+ tmp = s[i];
+ j = (j + tmp + key[i % keyLength]) & 0xFF;
+ s[i] = s[j];
+ s[j] = tmp;
+ }
+ this.s = s;
+ }
+
+ constructor.prototype = {
+ encryptBlock: function arcFourCipherEncryptBlock(data) {
+ var i, n = data.length, tmp, tmp2;
+ var a = this.a, b = this.b, s = this.s;
+ var output = new Uint8Array(n);
+ for (i = 0; i < n; ++i) {
+ a = (a + 1) & 0xFF;
+ tmp = s[a];
+ b = (b + tmp) & 0xFF;
+ tmp2 = s[b];
+ s[a] = tmp2;
+ s[b] = tmp;
+ output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
+ }
+ this.a = a;
+ this.b = b;
+ return output;
+ }
+ };
+ constructor.prototype.decryptBlock = constructor.prototype.encryptBlock;
+
+ return constructor;
+})();
+
+var calculateMD5 = (function calculateMD5() {
+ var r = new Uint8Array([
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+
+ var k = new Int32Array([
+ -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
+ -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
+ 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
+ 643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
+ 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
+ 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
+ -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
+ -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
+ -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
+ -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
+ -145523070, -1120210379, 718787259, -343485551]);
+
+ function hash(data, offset, length) {
+ var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
+ // pre-processing
+ var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
+ var padded = new Uint8Array(paddedLength);
+ var i, j, n;
+ for (i = 0; i < length; ++i)
+ padded[i] = data[offset++];
+ padded[i++] = 0x80;
+ n = paddedLength - 8;
+ while (i < n)
+ padded[i++] = 0;
+ padded[i++] = (length << 3) & 0xFF;
+ padded[i++] = (length >> 5) & 0xFF;
+ padded[i++] = (length >> 13) & 0xFF;
+ padded[i++] = (length >> 21) & 0xFF;
+ padded[i++] = (length >>> 29) & 0xFF;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ // chunking
+ // TODO ArrayBuffer ?
+ var w = new Int32Array(16);
+ for (i = 0; i < paddedLength;) {
+ for (j = 0; j < 16; ++j, i += 4) {
+ w[j] = (padded[i] | (padded[i + 1] << 8) |
+ (padded[i + 2] << 16) | (padded[i + 3] << 24));
+ }
+ var a = h0, b = h1, c = h2, d = h3, f, g;
+ for (j = 0; j < 64; ++j) {
+ if (j < 16) {
+ f = (b & c) | ((~b) & d);
+ g = j;
+ } else if (j < 32) {
+ f = (d & b) | ((~d) & c);
+ g = (5 * j + 1) & 15;
+ } else if (j < 48) {
+ f = b ^ c ^ d;
+ g = (3 * j + 5) & 15;
+ } else {
+ f = c ^ (b | (~d));
+ g = (7 * j) & 15;
+ }
+ var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
+ d = c;
+ c = b;
+ b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
+ a = tmp;
+ }
+ h0 = (h0 + a) | 0;
+ h1 = (h1 + b) | 0;
+ h2 = (h2 + c) | 0;
+ h3 = (h3 + d) | 0;
+ }
+ return new Uint8Array([
+ h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
+ h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
+ h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
+ h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
+ ]);
+ }
+ return hash;
+})();
+
+var NullCipher = (function nullCipher() {
+ function constructor() {
+ }
+
+ constructor.prototype = {
+ decryptBlock: function nullCipherDecryptBlock(data) {
+ return data;
+ }
+ };
+
+ return constructor;
+})();
+
+var AES128Cipher = (function aes128Cipher() {
+ var rcon = new Uint8Array([
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+ 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+ 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+ 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+ 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+ 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+ 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+ 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+ 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+ 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+ 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d]);
+
+ var s = new Uint8Array([
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+ 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+ 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+ 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+ 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+ 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+ 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+ 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+ 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+ 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+ 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+ 0xb0, 0x54, 0xbb, 0x16]);
+
+ var inv_s = new Uint8Array([
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+ 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+ 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+ 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+ 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+ 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+ 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+ 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+ 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+ 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+ 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+ 0x55, 0x21, 0x0c, 0x7d]);
+
+ var mix = new Uint32Array([
+ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+ 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+ 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+ 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+ 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+ 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+ 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+ 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+ 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+ 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+ 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+ 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+ 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+ 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+ 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+ 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+ 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+ 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+ 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+ 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+ 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+ 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+ 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+ 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+ 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+ 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+ 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+ 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+ 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+ 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+ 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+ 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+ 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+ 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+ 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+ 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+ 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+ 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+ 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+ 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+ 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+ 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+ 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+ function expandKey128(cipherKey) {
+ var b = 176, result = new Uint8Array(b);
+ result.set(cipherKey);
+ for (var j = 16, i = 1; j < b; ++i) {
+ // RotWord
+ var t1 = result[j - 3], t2 = result[j - 2],
+ t3 = result[j - 1], t4 = result[j - 4];
+ // SubWord
+ t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
+ // Rcon
+ t1 = t1 ^ rcon[i];
+ for (var n = 0; n < 4; ++n) {
+ result[j] = (t1 ^= result[j - 16]); j++;
+ result[j] = (t2 ^= result[j - 16]); j++;
+ result[j] = (t3 ^= result[j - 16]); j++;
+ result[j] = (t4 ^= result[j - 16]); j++;
+ }
+ }
+ return result;
+ }
+
+ function decrypt128(input, key) {
+ var state = new Uint8Array(16);
+ state.set(input);
+ var i, j, k;
+ var t, u, v;
+ // AddRoundKey
+ for (j = 0, k = 160; j < 16; ++j, ++k)
+ state[j] ^= key[k];
+ for (i = 9; i >= 1; --i) {
+ // InvShiftRows
+ t = state[13]; state[13] = state[9]; state[9] = state[5];
+ state[5] = state[1]; state[1] = t;
+ t = state[14]; u = state[10]; state[14] = state[6];
+ state[10] = state[2]; state[6] = t; state[2] = u;
+ t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+ state[11] = t; state[7] = u; state[3] = v;
+ // InvSubBytes
+ for (j = 0; j < 16; ++j)
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k)
+ state[j] ^= key[k];
+ // InvMixColumns
+ for (j = 0; j < 16; j += 4) {
+ var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+ s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+ t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+ (s3 >>> 24) ^ (s3 << 8));
+ state[j] = (t >>> 24) & 0xFF;
+ state[j + 1] = (t >> 16) & 0xFF;
+ state[j + 2] = (t >> 8) & 0xFF;
+ state[j + 3] = t & 0xFF;
+ }
+ }
+ // InvShiftRows
+ t = state[13]; state[13] = state[9]; state[9] = state[5];
+ state[5] = state[1]; state[1] = t;
+ t = state[14]; u = state[10]; state[14] = state[6];
+ state[10] = state[2]; state[6] = t; state[2] = u;
+ t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+ state[11] = t; state[7] = u; state[3] = v;
+ for (j = 0; j < 16; ++j) {
+ // InvSubBytes
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+ return state;
+ }
+
+ function constructor(key) {
+ this.key = expandKey128(key);
+ this.buffer = new Uint8Array(16);
+ this.bufferPosition = 0;
+ }
+
+ function decryptBlock2(data) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [], iv = this.iv;
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16)
+ continue;
+ // buffer is full, decrypting
+ var plain = decrypt128(buffer, this.key);
+ // xor-ing the IV vector to get plain text
+ for (j = 0; j < 16; ++j)
+ plain[j] ^= iv[j];
+ iv = buffer;
+ result.push(plain);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length == 0)
+ return new Uint8Array([]);
+ if (result.length == 1)
+ return result[0];
+ // combining plain text blocks into one
+ var output = new Uint8Array(16 * result.length);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
+ output.set(result[i], j);
+ return output;
+ }
+
+ constructor.prototype = {
+ decryptBlock: function aes128CipherDecryptBlock(data) {
+ var i, sourceLength = data.length;
+ var buffer = this.buffer, bufferLength = this.bufferPosition;
+ // waiting for IV values -- they are at the start of the stream
+ for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
+ buffer[bufferLength] = data[i];
+ if (bufferLength < 16) {
+ // need more data
+ this.bufferLength = bufferLength;
+ return new Uint8Array([]);
+ }
+ this.iv = buffer;
+ this.buffer = new Uint8Array(16);
+ this.bufferLength = 0;
+ // starting decryption
+ this.decryptBlock = decryptBlock2;
+ return this.decryptBlock(data.subarray(16));
+ }
+ };
+
+ return constructor;
+})();
+
+var CipherTransform = (function cipherTransform() {
+ function constructor(stringCipherConstructor, streamCipherConstructor) {
+ this.stringCipherConstructor = stringCipherConstructor;
+ this.streamCipherConstructor = streamCipherConstructor;
+ }
+ constructor.prototype = {
+ createStream: function cipherTransformCreateStream(stream) {
+ var cipher = new this.streamCipherConstructor();
+ return new DecryptStream(stream,
+ function cipherTransformDecryptStream(data) {
+ return cipher.decryptBlock(data);
+ }
+ );
+ },
+ decryptString: function cipherTransformDecryptString(s) {
+ var cipher = new this.stringCipherConstructor();
+ var data = stringToBytes(s);
+ data = cipher.decryptBlock(data);
+ return bytesToString(data);
+ }
+ };
+ return constructor;
+})();
+
+var CipherTransformFactory = (function cipherTransformFactory() {
+ function prepareKeyData(fileId, password, ownerPassword, userPassword,
+ flags, revision, keyLength, encryptMetadata) {
+ var defaultPasswordBytes = new Uint8Array([
+ 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
+ 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+ 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
+ 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+ var hashData = new Uint8Array(100), i = 0, j, n;
+ if (password) {
+ n = Math.min(32, password.length);
+ for (; i < n; ++i)
+ hashData[i] = password[i];
+ }
+ j = 0;
+ while (i < 32) {
+ hashData[i++] = defaultPasswordBytes[j++];
+ }
+ // as now the padded password in the hashData[0..i]
+ for (j = 0, n = ownerPassword.length; j < n; ++j)
+ hashData[i++] = ownerPassword[j];
+ hashData[i++] = flags & 0xFF;
+ hashData[i++] = (flags >> 8) & 0xFF;
+ hashData[i++] = (flags >> 16) & 0xFF;
+ hashData[i++] = (flags >>> 24) & 0xFF;
+ for (j = 0, n = fileId.length; j < n; ++j)
+ hashData[i++] = fileId[j];
+ if (revision >= 4 && !encryptMetadata) {
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ }
+ var hash = calculateMD5(hashData, 0, i);
+ var keyLengthInBytes = keyLength >> 3;
+ if (revision >= 3) {
+ for (j = 0; j < 50; ++j) {
+ hash = calculateMD5(hash, 0, keyLengthInBytes);
+ }
+ }
+ var encryptionKey = hash.subarray(0, keyLengthInBytes);
+ var cipher, checkData;
+
+ if (revision >= 3) {
+ // padded password in hashData, we can use this array for user
+ // password check
+ i = 32;
+ for (j = 0, n = fileId.length; j < n; ++j)
+ hashData[i++] = fileId[j];
+ cipher = new ARCFourCipher(encryptionKey);
+ var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+ n = encryptionKey.length;
+ var derivedKey = new Uint8Array(n), k;
+ for (j = 1; j <= 19; ++j) {
+ for (k = 0; k < n; ++k)
+ derivedKey[k] = encryptionKey[k] ^ j;
+ cipher = new ARCFourCipher(derivedKey);
+ checkData = cipher.encryptBlock(checkData);
+ }
+ } else {
+ cipher = new ARCFourCipher(encryptionKey);
+ checkData = cipher.encryptBlock(hashData.subarray(0, 32));
+ }
+ for (j = 0, n = checkData.length; j < n; ++j) {
+ if (userPassword[j] != checkData[j])
+ error('incorrect password');
+ }
+ return encryptionKey;
+ }
+
+ var identityName = new Name('Identity');
+
+ function constructor(dict, fileId, password) {
+ var filter = dict.get('Filter');
+ if (!isName(filter) || filter.name != 'Standard')
+ error('unknown encryption method');
+ this.dict = dict;
+ var algorithm = dict.get('V');
+ if (!isInt(algorithm) ||
+ (algorithm != 1 && algorithm != 2 && algorithm != 4))
+ error('unsupported encryption algorithm');
+ this.algorithm = algorithm;
+ var keyLength = dict.get('Length') || 40;
+ if (!isInt(keyLength) ||
+ keyLength < 40 || (keyLength % 8) != 0)
+ error('invalid key length');
+ // prepare keys
+ var ownerPassword = stringToBytes(dict.get('O'));
+ var userPassword = stringToBytes(dict.get('U'));
+ var flags = dict.get('P');
+ var revision = dict.get('R');
+ var encryptMetadata =
+ dict.get('EncryptMetadata') !== false; // makes true as default value
+ var fileIdBytes = stringToBytes(fileId);
+ var passwordBytes;
+ if (password)
+ passwordBytes = stringToBytes(password);
+
+ this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
+ ownerPassword, userPassword,
+ flags, revision,
+ keyLength, encryptMetadata);
+ if (algorithm == 4) {
+ this.cf = dict.get('CF');
+ this.stmf = dict.get('StmF') || identityName;
+ this.strf = dict.get('StrF') || identityName;
+ this.eff = dict.get('EFF') || this.strf;
+ }
+ }
+
+ function buildObjectKey(num, gen, encryptionKey, isAes) {
+ var key = new Uint8Array(encryptionKey.length + 9), i, n;
+ for (i = 0, n = encryptionKey.length; i < n; ++i)
+ key[i] = encryptionKey[i];
+ key[i++] = num & 0xFF;
+ key[i++] = (num >> 8) & 0xFF;
+ key[i++] = (num >> 16) & 0xFF;
+ key[i++] = gen & 0xFF;
+ key[i++] = (gen >> 8) & 0xFF;
+ if (isAes) {
+ key[i++] = 0x73;
+ key[i++] = 0x41;
+ key[i++] = 0x6C;
+ key[i++] = 0x54;
+ }
+ var hash = calculateMD5(key, 0, i);
+ return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+ }
+
+ function buildCipherConstructor(cf, name, num, gen, key) {
+ var cryptFilter = cf.get(name.name);
+ var cfm;
+ if (cryptFilter != null)
+ cfm = cryptFilter.get('CFM');
+ if (!cfm || cfm.name == 'None') {
+ return function cipherTransformFactoryBuildCipherConstructorNone() {
+ return new NullCipher();
+ };
+ }
+ if ('V2' == cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorV2() {
+ return new ARCFourCipher(
+ buildObjectKey(num, gen, key, false));
+ };
+ }
+ if ('AESV2' == cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+ return new AES128Cipher(
+ buildObjectKey(num, gen, key, true));
+ };
+ }
+ error('Unknown crypto method');
+ return null;
+ }
+
+ constructor.prototype = {
+ createCipherTransform: function buildCipherCreateCipherTransform(num,
+ gen) {
+ if (this.algorithm == 4) {
+ return new CipherTransform(
+ buildCipherConstructor(this.cf, this.stmf,
+ num, gen, this.encryptionKey),
+ buildCipherConstructor(this.cf, this.strf,
+ num, gen, this.encryptionKey));
+ }
+ // algorithms 1 and 2
+ var key = buildObjectKey(num, gen, this.encryptionKey, false);
+ var cipherConstructor = function buildCipherCipherConstructor() {
+ return new ARCFourCipher(key);
+ };
+ return new CipherTransform(cipherConstructor, cipherConstructor);
+ }
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/evaluator.js b/apps/files_pdfviewer/js/pdfjs/src/evaluator.js
new file mode 100755
index 00000000000..a863a531ec5
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/evaluator.js
@@ -0,0 +1,857 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PartialEvaluator = (function partialEvaluator() {
+ function constructor(xref, handler, uniquePrefix) {
+ this.state = new EvalState();
+ this.stateStack = [];
+
+ this.xref = xref;
+ this.handler = handler;
+ this.uniquePrefix = uniquePrefix;
+ this.objIdCounter = 0;
+ }
+
+ var OP_MAP = {
+ // Graphics state
+ w: 'setLineWidth',
+ J: 'setLineCap',
+ j: 'setLineJoin',
+ M: 'setMiterLimit',
+ d: 'setDash',
+ ri: 'setRenderingIntent',
+ i: 'setFlatness',
+ gs: 'setGState',
+ q: 'save',
+ Q: 'restore',
+ cm: 'transform',
+
+ // Path
+ m: 'moveTo',
+ l: 'lineTo',
+ c: 'curveTo',
+ v: 'curveTo2',
+ y: 'curveTo3',
+ h: 'closePath',
+ re: 'rectangle',
+ S: 'stroke',
+ s: 'closeStroke',
+ f: 'fill',
+ F: 'fill',
+ 'f*': 'eoFill',
+ B: 'fillStroke',
+ 'B*': 'eoFillStroke',
+ b: 'closeFillStroke',
+ 'b*': 'closeEOFillStroke',
+ n: 'endPath',
+
+ // Clipping
+ W: 'clip',
+ 'W*': 'eoClip',
+
+ // Text
+ BT: 'beginText',
+ ET: 'endText',
+ Tc: 'setCharSpacing',
+ Tw: 'setWordSpacing',
+ Tz: 'setHScale',
+ TL: 'setLeading',
+ Tf: 'setFont',
+ Tr: 'setTextRenderingMode',
+ Ts: 'setTextRise',
+ Td: 'moveText',
+ TD: 'setLeadingMoveText',
+ Tm: 'setTextMatrix',
+ 'T*': 'nextLine',
+ Tj: 'showText',
+ TJ: 'showSpacedText',
+ "'": 'nextLineShowText',
+ '"': 'nextLineSetSpacingShowText',
+
+ // Type3 fonts
+ d0: 'setCharWidth',
+ d1: 'setCharWidthAndBounds',
+
+ // Color
+ CS: 'setStrokeColorSpace',
+ cs: 'setFillColorSpace',
+ SC: 'setStrokeColor',
+ SCN: 'setStrokeColorN',
+ sc: 'setFillColor',
+ scn: 'setFillColorN',
+ G: 'setStrokeGray',
+ g: 'setFillGray',
+ RG: 'setStrokeRGBColor',
+ rg: 'setFillRGBColor',
+ K: 'setStrokeCMYKColor',
+ k: 'setFillCMYKColor',
+
+ // Shading
+ sh: 'shadingFill',
+
+ // Images
+ BI: 'beginInlineImage',
+ ID: 'beginImageData',
+ EI: 'endInlineImage',
+
+ // XObjects
+ Do: 'paintXObject',
+
+ // Marked content
+ MP: 'markPoint',
+ DP: 'markPointProps',
+ BMC: 'beginMarkedContent',
+ BDC: 'beginMarkedContentProps',
+ EMC: 'endMarkedContent',
+
+ // Compatibility
+ BX: 'beginCompat',
+ EX: 'endCompat'
+ };
+
+ constructor.prototype = {
+ getIRQueue: function partialEvaluatorGetIRQueue(stream, resources,
+ queue, dependency) {
+
+ var self = this;
+ var xref = this.xref;
+ var handler = this.handler;
+ var uniquePrefix = this.uniquePrefix;
+
+ function insertDependency(depList) {
+ fnArray.push('dependency');
+ argsArray.push(depList);
+ for (var i = 0, ii = depList.length; i < ii; i++) {
+ var dep = depList[i];
+ if (dependency.indexOf(dep) == -1) {
+ dependency.push(depList[i]);
+ }
+ }
+ }
+
+ function handleSetFont(fontName, fontRef) {
+ var loadedName = null;
+
+ var fontRes = resources.get('Font');
+
+ // TODO: TOASK: Is it possible to get here? If so, what does
+ // args[0].name should be like???
+ assert(fontRes, 'fontRes not available');
+
+ fontRes = xref.fetchIfRef(fontRes);
+ fontRef = fontRef || fontRes.get(fontName);
+ var font = xref.fetchIfRef(fontRef);
+ assertWellFormed(isDict(font));
+ if (!font.translated) {
+ font.translated = self.translateFont(font, xref, resources,
+ dependency);
+ if (font.translated) {
+ // keep track of each font we translated so the caller can
+ // load them asynchronously before calling display on a page
+ loadedName = 'font_' + uniquePrefix + (++self.objIdCounter);
+ font.translated.properties.loadedName = loadedName;
+ font.loadedName = loadedName;
+
+ var translated = font.translated;
+ handler.send('obj', [
+ loadedName,
+ 'Font',
+ translated.name,
+ translated.file,
+ translated.properties
+ ]);
+ }
+ }
+ loadedName = loadedName || font.loadedName;
+
+ // Ensure the font is ready before the font is set
+ // and later on used for drawing.
+ // TODO: This should get insert to the IRQueue only once per
+ // page.
+ insertDependency([loadedName]);
+ return loadedName;
+ }
+
+ function buildPaintImageXObject(image, inline) {
+ var dict = image.dict;
+ var w = dict.get('Width', 'W');
+ var h = dict.get('Height', 'H');
+
+ if (image instanceof JpegStream && image.isNative) {
+ var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
+ handler.send('obj', [objId, 'JpegStream', image.getIR()]);
+
+ // Add the dependency on the image object.
+ insertDependency([objId]);
+
+ // The normal fn.
+ fn = 'paintJpegXObject';
+ args = [objId, w, h];
+
+ return;
+ }
+
+ // Needs to be rendered ourself.
+
+ // Figure out if the image has an imageMask.
+ var imageMask = dict.get('ImageMask', 'IM') || false;
+
+ // If there is no imageMask, create the PDFImage and a lot
+ // of image processing can be done here.
+ if (!imageMask) {
+ var imageObj = new PDFImage(xref, resources, image, inline);
+
+ if (imageObj.imageMask) {
+ throw 'Can\'t handle this in the web worker :/';
+ }
+
+ var imgData = {
+ width: w,
+ height: h,
+ data: new Uint8Array(w * h * 4)
+ };
+ var pixels = imgData.data;
+ imageObj.fillRgbaBuffer(pixels, imageObj.decode);
+
+ fn = 'paintImageXObject';
+ args = [imgData];
+ return;
+ }
+
+ // This depends on a tmpCanvas beeing filled with the
+ // current fillStyle, such that processing the pixel
+ // data can't be done here. Instead of creating a
+ // complete PDFImage, only read the information needed
+ // for later.
+ fn = 'paintImageMaskXObject';
+
+ var width = dict.get('Width', 'W');
+ var height = dict.get('Height', 'H');
+ var bitStrideLength = (width + 7) >> 3;
+ var imgArray = image.getBytes(bitStrideLength * height);
+ var decode = dict.get('Decode', 'D');
+ var inverseDecode = !!decode && decode[0] > 0;
+
+ args = [imgArray, inverseDecode, width, height];
+ }
+
+ uniquePrefix = uniquePrefix || '';
+ if (!queue.argsArray) {
+ queue.argsArray = [];
+ }
+ if (!queue.fnArray) {
+ queue.fnArray = [];
+ }
+
+ var fnArray = queue.fnArray, argsArray = queue.argsArray;
+ var dependencyArray = dependency || [];
+
+ resources = xref.fetchIfRef(resources) || new Dict();
+ var xobjs = xref.fetchIfRef(resources.get('XObject')) || new Dict();
+ var patterns = xref.fetchIfRef(resources.get('Pattern')) || new Dict();
+ var parser = new Parser(new Lexer(stream), false);
+ var res = resources;
+ var args = [], obj;
+ var getObjBt = function getObjBt() {
+ parser = this.oldParser;
+ return { name: 'BT' };
+ };
+ var TILING_PATTERN = 1, SHADING_PATTERN = 2;
+
+ while (!isEOF(obj = parser.getObj())) {
+ if (isCmd(obj)) {
+ var cmd = obj.cmd;
+ var fn = OP_MAP[cmd];
+ if (!fn) {
+ // invalid content command, trying to recover
+ if (cmd.substr(-2) == 'BT') {
+ fn = OP_MAP[cmd.substr(0, cmd.length - 2)];
+ // feeding 'BT' on next interation
+ parser = {
+ getObj: getObjBt,
+ oldParser: parser
+ };
+ }
+ }
+ assertWellFormed(fn, 'Unknown command "' + cmd + '"');
+ // TODO figure out how to type-check vararg functions
+
+ if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
+ // Use the IR version for setStroke/FillColorN.
+ fn += '_IR';
+
+ // compile tiling patterns
+ var patternName = args[args.length - 1];
+ // SCN/scn applies patterns along with normal colors
+ if (isName(patternName)) {
+ var pattern = xref.fetchIfRef(patterns.get(patternName.name));
+ if (pattern) {
+ var dict = isStream(pattern) ? pattern.dict : pattern;
+ var typeNum = dict.get('PatternType');
+
+ if (typeNum == TILING_PATTERN) {
+ // Create an IR of the pattern code.
+ var depIdx = dependencyArray.length;
+ var queueObj = {};
+ var codeIR = this.getIRQueue(pattern, dict.get('Resources'),
+ queueObj, dependencyArray);
+
+ // Add the dependencies that are required to execute the
+ // codeIR.
+ insertDependency(dependencyArray.slice(depIdx));
+
+ args = TilingPattern.getIR(codeIR, dict, args);
+ }
+ else if (typeNum == SHADING_PATTERN) {
+ var shading = xref.fetchIfRef(dict.get('Shading'));
+ var matrix = dict.get('Matrix');
+ var pattern = Pattern.parseShading(shading, matrix, xref, res,
+ null /*ctx*/);
+ args = pattern.getIR();
+ } else {
+ error('Unkown PatternType ' + typeNum);
+ }
+ }
+ }
+ } else if (cmd == 'Do' && !args[0].code) {
+ // eagerly compile XForm objects
+ var name = args[0].name;
+ var xobj = xobjs.get(name);
+ if (xobj) {
+ xobj = xref.fetchIfRef(xobj);
+ assertWellFormed(isStream(xobj), 'XObject should be a stream');
+
+ var type = xobj.dict.get('Subtype');
+ assertWellFormed(
+ isName(type),
+ 'XObject should have a Name subtype'
+ );
+
+ if ('Form' == type.name) {
+ var matrix = xobj.dict.get('Matrix');
+ var bbox = xobj.dict.get('BBox');
+
+ fnArray.push('paintFormXObjectBegin');
+ argsArray.push([matrix, bbox]);
+
+ // This adds the IRQueue of the xObj to the current queue.
+ var depIdx = dependencyArray.length;
+
+ this.getIRQueue(xobj, xobj.dict.get('Resources'), queue,
+ dependencyArray);
+
+ // Add the dependencies that are required to execute the
+ // codeIR.
+ insertDependency(dependencyArray.slice(depIdx));
+
+ fn = 'paintFormXObjectEnd';
+ args = [];
+ } else if ('Image' == type.name) {
+ buildPaintImageXObject(xobj, false);
+ } else {
+ error('Unhandled XObject subtype ' + type.name);
+ }
+ }
+ } else if (cmd == 'Tf') { // eagerly collect all fonts
+ args[0] = handleSetFont(args[0].name);
+ } else if (cmd == 'EI') {
+ buildPaintImageXObject(args[0], true);
+ }
+
+ switch (fn) {
+ // Parse the ColorSpace data to a raw format.
+ case 'setFillColorSpace':
+ case 'setStrokeColorSpace':
+ args = [ColorSpace.parseToIR(args[0], xref, resources)];
+ break;
+ case 'shadingFill':
+ var shadingRes = xref.fetchIfRef(res.get('Shading'));
+ if (!shadingRes)
+ error('No shading resource found');
+
+ var shading = xref.fetchIfRef(shadingRes.get(args[0].name));
+ if (!shading)
+ error('No shading object found');
+
+ var shadingFill = Pattern.parseShading(shading, null, xref, res,
+ null);
+ var patternIR = shadingFill.getIR();
+ args = [patternIR];
+ fn = 'shadingFill';
+ break;
+ case 'setGState':
+ var dictName = args[0];
+ var extGState = xref.fetchIfRef(resources.get('ExtGState'));
+
+ if (!isDict(extGState) || !extGState.has(dictName.name))
+ break;
+
+ var gsState = xref.fetchIfRef(extGState.get(dictName.name));
+
+ // This array holds the converted/processed state data.
+ var gsStateObj = [];
+
+ gsState.forEach(
+ function canvasGraphicsSetGStateForEach(key, value) {
+ switch (key) {
+ case 'Type':
+ break;
+ case 'LW':
+ case 'LC':
+ case 'LJ':
+ case 'ML':
+ case 'D':
+ case 'RI':
+ case 'FL':
+ case 'CA':
+ case 'ca':
+ gsStateObj.push([key, value]);
+ break;
+ case 'Font':
+ gsStateObj.push([
+ 'Font',
+ handleSetFont(null, value[0]),
+ value[1]
+ ]);
+ break;
+ case 'OP':
+ case 'op':
+ case 'OPM':
+ case 'BG':
+ case 'BG2':
+ case 'UCR':
+ case 'UCR2':
+ case 'TR':
+ case 'TR2':
+ case 'HT':
+ case 'SM':
+ case 'SA':
+ case 'BM':
+ case 'SMask':
+ case 'AIS':
+ case 'TK':
+ TODO('graphic state operator ' + key);
+ break;
+ default:
+ warn('Unknown graphic state operator ' + key);
+ break;
+ }
+ }
+ );
+ args = [gsStateObj];
+ break;
+ } // switch
+
+ fnArray.push(fn);
+ argsArray.push(args);
+ args = [];
+ } else if (obj != null) {
+ assertWellFormed(args.length <= 33, 'Too many arguments');
+ args.push(obj);
+ }
+ }
+
+ return {
+ fnArray: fnArray,
+ argsArray: argsArray
+ };
+ },
+
+ extractDataStructures: function
+ partialEvaluatorExtractDataStructures(dict, baseDict,
+ xref, properties) {
+ // 9.10.2
+ var toUnicode = dict.get('ToUnicode') ||
+ baseDict.get('ToUnicode');
+ if (toUnicode)
+ properties.toUnicode = this.readToUnicode(toUnicode, xref);
+
+ if (properties.composite) {
+ // CIDSystemInfo helps to match CID to glyphs
+ var cidSystemInfo = xref.fetchIfRef(dict.get('CIDSystemInfo'));
+ if (isDict(cidSystemInfo)) {
+ properties.cidSystemInfo = {
+ registry: cidSystemInfo.get('Registry'),
+ ordering: cidSystemInfo.get('Ordering'),
+ supplement: cidSystemInfo.get('Supplement')
+ };
+ }
+
+ var cidToGidMap = xref.fetchIfRef(dict.get('CIDToGIDMap'));
+ if (isStream(cidToGidMap))
+ properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+ }
+
+ var differences = [];
+ var baseEncoding = Encodings.StandardEncoding;
+ var hasEncoding = dict.has('Encoding');
+ if (hasEncoding) {
+ var encoding = xref.fetchIfRef(dict.get('Encoding'));
+ if (isDict(encoding)) {
+ var baseName = encoding.get('BaseEncoding');
+ if (baseName)
+ baseEncoding = Encodings[baseName.name];
+
+ // Load the differences between the base and original
+ if (encoding.has('Differences')) {
+ var diffEncoding = encoding.get('Differences');
+ var index = 0;
+ for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+ var data = diffEncoding[j];
+ if (isNum(data))
+ index = data;
+ else
+ differences[index++] = data.name;
+ }
+ }
+ } else if (isName(encoding)) {
+ baseEncoding = Encodings[encoding.name];
+ } else {
+ error('Encoding is not a Name nor a Dict');
+ }
+ }
+ properties.differences = differences;
+ properties.baseEncoding = baseEncoding;
+ properties.hasEncoding = hasEncoding;
+ },
+
+ readToUnicode:
+ function partialEvaluatorReadToUnicode(toUnicode, xref) {
+ var cmapObj = xref.fetchIfRef(toUnicode);
+ var charToUnicode = [];
+ if (isName(cmapObj)) {
+ var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
+ if (!isIdentityMap)
+ error('ToUnicode file cmap translation not implemented');
+ } else if (isStream(cmapObj)) {
+ var tokens = [];
+ var token = '';
+ var beginArrayToken = {};
+
+ var cmap = cmapObj.getBytes(cmapObj.length);
+ for (var i = 0, ii = cmap.length; i < ii; i++) {
+ var byte = cmap[i];
+ if (byte == 0x20 || byte == 0x0D || byte == 0x0A ||
+ byte == 0x3C || byte == 0x5B || byte == 0x5D) {
+ switch (token) {
+ case 'usecmap':
+ error('usecmap is not implemented');
+ break;
+
+ case 'beginbfchar':
+ case 'beginbfrange':
+ case 'begincidchar':
+ case 'begincidrange':
+ token = '';
+ tokens = [];
+ break;
+
+ case 'endcidrange':
+ case 'endbfrange':
+ for (var j = 0, jj = tokens.length; j < jj; j += 3) {
+ var startRange = tokens[j];
+ var endRange = tokens[j + 1];
+ var code = tokens[j + 2];
+ while (startRange <= endRange) {
+ charToUnicode[startRange] = code++;
+ ++startRange;
+ }
+ }
+ break;
+
+ case 'endcidchar':
+ case 'endbfchar':
+ for (var j = 0, jj = tokens.length; j < jj; j += 2) {
+ var index = tokens[j];
+ var code = tokens[j + 1];
+ charToUnicode[index] = code;
+ }
+ break;
+
+ case '':
+ break;
+
+ default:
+ if (token[0] >= '0' && token[0] <= '9')
+ token = parseInt(token, 10); // a number
+ tokens.push(token);
+ token = '';
+ }
+ switch (byte) {
+ case 0x5B:
+ // begin list parsing
+ tokens.push(beginArrayToken);
+ break;
+ case 0x5D:
+ // collect array items
+ var items = [], item;
+ while (tokens.length &&
+ (item = tokens.pop()) != beginArrayToken)
+ items.unshift(item);
+ tokens.push(items);
+ break;
+ }
+ } else if (byte == 0x3E) {
+ if (token.length) {
+ // parsing hex number
+ tokens.push(parseInt(token, 16));
+ token = '';
+ }
+ } else {
+ token += String.fromCharCode(byte);
+ }
+ }
+ }
+ return charToUnicode;
+ },
+ readCidToGidMap:
+ function partialEvaluatorReadCidToGidMap(cidToGidStream) {
+ // Extract the encoding from the CIDToGIDMap
+ var glyphsData = cidToGidStream.getBytes();
+
+ // Set encoding 0 to later verify the font has an encoding
+ var result = [];
+ for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+ var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
+ if (glyphID == 0)
+ continue;
+
+ var code = j >> 1;
+ result[code] = glyphID;
+ }
+ return result;
+ },
+
+ extractWidths: function partialEvaluatorWidths(dict,
+ xref,
+ descriptor,
+ properties) {
+ var glyphsWidths = [];
+ var defaultWidth = 0;
+ if (properties.composite) {
+ defaultWidth = xref.fetchIfRef(dict.get('DW')) || 1000;
+
+ var widths = xref.fetchIfRef(dict.get('W'));
+ if (widths) {
+ var start = 0, end = 0;
+ for (var i = 0, ii = widths.length; i < ii; i++) {
+ var code = widths[i];
+ if (isArray(code)) {
+ for (var j = 0, jj = code.length; j < jj; j++)
+ glyphsWidths[start++] = code[j];
+ start = 0;
+ } else if (start) {
+ var width = widths[++i];
+ for (var j = start; j <= code; j++)
+ glyphsWidths[j] = width;
+ start = 0;
+ } else {
+ start = code;
+ }
+ }
+ }
+ } else {
+ var firstChar = properties.firstChar;
+ var widths = xref.fetchIfRef(dict.get('Widths'));
+ if (widths) {
+ var j = firstChar;
+ for (var i = 0, ii = widths.length; i < ii; i++)
+ glyphsWidths[j++] = widths[i];
+ defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
+ } else {
+ // Trying get the BaseFont metrics (see comment above).
+ var baseFontName = dict.get('BaseFont');
+ if (isName(baseFontName)) {
+ var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+ glyphsWidths = metrics.widths;
+ defaultWidth = metrics.defaultWidth;
+ }
+ }
+ }
+
+ properties.defaultWidth = defaultWidth;
+ properties.widths = glyphsWidths;
+ },
+
+ getBaseFontMetrics: function getBaseFontMetrics(name) {
+ var defaultWidth = 0, widths = [];
+ var glyphWidths = Metrics[stdFontMap[name] || name];
+ if (isNum(glyphWidths)) {
+ defaultWidth = glyphWidths;
+ } else {
+ widths = glyphWidths;
+ }
+
+ return {
+ defaultWidth: defaultWidth,
+ widths: widths
+ };
+ },
+
+ translateFont: function partialEvaluatorTranslateFont(dict, xref, resources,
+ dependency) {
+ var baseDict = dict;
+ var type = dict.get('Subtype');
+ assertWellFormed(isName(type), 'invalid font Subtype');
+
+ var composite = false;
+ if (type.name == 'Type0') {
+ // If font is a composite
+ // - get the descendant font
+ // - set the type according to the descendant font
+ // - get the FontDescriptor from the descendant font
+ var df = dict.get('DescendantFonts');
+ if (!df)
+ return null;
+
+ if (isRef(df))
+ df = xref.fetch(df);
+
+ dict = xref.fetchIfRef(isRef(df) ? df : df[0]);
+
+ type = dict.get('Subtype');
+ assertWellFormed(isName(type), 'invalid font Subtype');
+ composite = true;
+ }
+ var maxCharIndex = composite ? 0xFFFF : 0xFF;
+
+ var descriptor = xref.fetchIfRef(dict.get('FontDescriptor'));
+ if (!descriptor) {
+ if (type.name == 'Type3') {
+ // FontDescriptor is only required for Type3 fonts when the document
+ // is a tagged pdf. Create a barbebones one to get by.
+ descriptor = new Dict();
+ descriptor.set('FontName', new Name(type.name));
+ } else {
+ // Before PDF 1.5 if the font was one of the base 14 fonts, having a
+ // FontDescriptor was not required.
+ // This case is here for compatibility.
+ var baseFontName = dict.get('BaseFont');
+ if (!isName(baseFontName))
+ return null;
+
+ // Using base font name as a font name.
+ baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+ var metrics = this.getBaseFontMetrics(baseFontName);
+
+ var properties = {
+ type: type.name,
+ widths: metrics.widths,
+ defaultWidth: metrics.defaultWidth,
+ firstChar: 0,
+ lastChar: maxCharIndex
+ };
+ this.extractDataStructures(dict, dict, xref, properties);
+
+ return {
+ name: baseFontName,
+ dict: baseDict,
+ properties: properties
+ };
+ }
+
+ }
+
+ // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
+ // 'LastChar' and 'Widths' should exists too, but some PDF encoders seems
+ // to ignore this rule when a variant of a standart font is used.
+ // TODO Fill the width array depending on which of the base font this is
+ // a variant.
+ var firstChar = xref.fetchIfRef(dict.get('FirstChar')) || 0;
+ var lastChar = xref.fetchIfRef(dict.get('LastChar')) || maxCharIndex;
+ var fontName = xref.fetchIfRef(descriptor.get('FontName'));
+ assertWellFormed(isName(fontName), 'invalid font name');
+
+ var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+ if (fontFile) {
+ fontFile = xref.fetchIfRef(fontFile);
+ if (fontFile.dict) {
+ var subtype = fontFile.dict.get('Subtype');
+ if (subtype)
+ subtype = subtype.name;
+
+ var length1 = fontFile.dict.get('Length1');
+ if (!isInt(length1))
+ length1 = xref.fetchIfRef(length1);
+
+ var length2 = fontFile.dict.get('Length2');
+ if (!isInt(length2))
+ length2 = xref.fetchIfRef(length2);
+ }
+ }
+
+ var properties = {
+ type: type.name,
+ subtype: subtype,
+ file: fontFile,
+ length1: length1,
+ length2: length2,
+ composite: composite,
+ fixedPitch: false,
+ fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
+ firstChar: firstChar || 0,
+ lastChar: lastChar || maxCharIndex,
+ bbox: descriptor.get('FontBBox'),
+ ascent: descriptor.get('Ascent'),
+ descent: descriptor.get('Descent'),
+ xHeight: descriptor.get('XHeight'),
+ capHeight: descriptor.get('CapHeight'),
+ flags: descriptor.get('Flags'),
+ italicAngle: descriptor.get('ItalicAngle'),
+ coded: false
+ };
+ this.extractWidths(dict, xref, descriptor, properties);
+ this.extractDataStructures(dict, baseDict, xref, properties);
+
+ if (type.name === 'Type3') {
+ properties.coded = true;
+ var charProcs = xref.fetchIfRef(dict.get('CharProcs'));
+ var fontResources = xref.fetchIfRef(dict.get('Resources')) || resources;
+ properties.resources = fontResources;
+ properties.charProcIRQueues = {};
+ for (var key in charProcs.map) {
+ var glyphStream = xref.fetchIfRef(charProcs.map[key]);
+ var queueObj = {};
+ properties.charProcIRQueues[key] =
+ this.getIRQueue(glyphStream, fontResources, queueObj, dependency);
+ }
+ }
+
+ return {
+ name: fontName.name,
+ dict: baseDict,
+ file: fontFile,
+ properties: properties
+ };
+ }
+ };
+
+ return constructor;
+})();
+
+var EvalState = (function evalState() {
+ function constructor() {
+ // Are soft masks and alpha values shapes or opacities?
+ this.alphaIsShape = false;
+ this.fontSize = 0;
+ this.textMatrix = IDENTITY_MATRIX;
+ this.leading = 0;
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ // Color spaces
+ this.fillColorSpace = null;
+ this.strokeColorSpace = null;
+ }
+ constructor.prototype = {
+ };
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/fonts.js b/apps/files_pdfviewer/js/pdfjs/src/fonts.js
new file mode 100755
index 00000000000..116bb4dfc71
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/fonts.js
@@ -0,0 +1,3568 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var isWorker = (typeof window == 'undefined');
+
+/**
+ * Maximum time to wait for a font to be loaded by font-face rules.
+ */
+var kMaxWaitForFontFace = 1000;
+
+// Unicode Private Use Area
+var kCmapGlyphOffset = 0xE000;
+var kSizeOfGlyphArea = 0x1900;
+
+// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
+// except for Type 3 fonts
+var kPDFGlyphSpaceUnits = 1000;
+
+// Until hinting is fully supported this constant can be used
+var kHintingEnabled = false;
+
+var Encodings = {
+ get ExpertEncoding() {
+ return shadow(this, 'ExpertEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '',
+ 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+ 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+ 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+ 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'questionsmall', '',
+ 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '',
+ '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior',
+ 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff',
+ 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
+ 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '',
+ 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
+ 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
+ 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
+ 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
+ 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
+ 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
+ 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
+ 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
+ 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
+ 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'
+ ]);
+ },
+ get MacExpertEncoding() {
+ return shadow(this, 'MacExpertEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall',
+ 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+ 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior',
+ 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period',
+ 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+ 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+ 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon',
+ '', 'threequartersemdash', '', 'questionsmall', '', '', '', '',
+ 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters',
+ 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird',
+ 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',
+ 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall',
+ 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall',
+ 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall',
+ 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall',
+ 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall',
+ 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '',
+ 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall',
+ 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall',
+ 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
+ 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
+ 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
+ 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
+ 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
+ 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
+ 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
+ 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
+ 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
+ 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
+ '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '',
+ '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '',
+ 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior',
+ 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall',
+ 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior',
+ 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'
+ ]);
+ },
+ get MacRomanEncoding() {
+ return shadow(this, 'MacRomanEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring',
+ 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute',
+ 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla',
+ 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave',
+ 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex',
+ 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis',
+ 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph',
+ 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus',
+ 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',
+ 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega',
+ 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical',
+ 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',
+ 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+ 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+ 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+ 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
+ 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
+ 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
+ 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla',
+ 'hungarumlaut', 'ogonek', 'caron'
+ ]);
+ },
+ get StandardEncoding() {
+ return shadow(this, 'StandardEncoding', ['', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', 'exclamdown',
+ 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring',
+ 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '',
+ 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine',
+ '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash',
+ 'oslash', 'oe', 'germandbls'
+ ]);
+ },
+ get WinAnsiEncoding() {
+ return shadow(this, 'WinAnsiEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro',
+ 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis',
+ 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
+ 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet',
+ 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet',
+ 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright',
+ 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent',
+ 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis',
+ 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen',
+ 'registered', 'macron', 'degree', 'plusminus', 'twosuperior',
+ 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter',
+ 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute',
+ 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave',
+ 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae',
+ 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave',
+ 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
+ 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
+ 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
+ 'ydieresis'
+ ]);
+ },
+ get symbolsEncoding() {
+ return shadow(this, 'symbolsEncoding', ['', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign',
+ 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft',
+ 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period',
+ 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',
+ 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon',
+ 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu',
+ 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1',
+ 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright',
+ 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi',
+ 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa',
+ 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau',
+ 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar',
+ 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction',
+ 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth',
+ 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus',
+ 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff',
+ 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis',
+ 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur',
+ 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset',
+ 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset',
+ 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle',
+ 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif',
+ 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor',
+ 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright',
+ 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans',
+ 'trademarksans', 'summation', 'parenlefttp', 'parenleftex',
+ 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt',
+ 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '',
+ 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
+ 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
+ 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
+ 'bracerightbt'
+ ]);
+ },
+ get zapfDingbatsEncoding() {
+ return shadow(this, 'zapfDingbatsEncoding', ['', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4',
+ 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16',
+ 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25',
+ 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31',
+ 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41',
+ 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51',
+ 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61',
+ 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71',
+ 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79',
+ 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',
+ 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',
+ 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',
+ 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',
+ 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',
+ 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',
+ 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',
+ 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',
+ 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',
+ 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197',
+ 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190',
+ 'a191'
+ ]);
+ }
+};
+
+/**
+ * Hold a map of decoded fonts and of the standard fourteen Type1
+ * fonts and their acronyms.
+ */
+var stdFontMap = {
+ 'ArialNarrow': 'Helvetica',
+ 'ArialNarrow-Bold': 'Helvetica-Bold',
+ 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialNarrow-Italic': 'Helvetica-Oblique',
+ 'ArialBlack': 'Helvetica',
+ 'ArialBlack-Bold': 'Helvetica-Bold',
+ 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialBlack-Italic': 'Helvetica-Oblique',
+ 'Arial': 'Helvetica',
+ 'Arial-Bold': 'Helvetica-Bold',
+ 'Arial-BoldItalic': 'Helvetica-BoldOblique',
+ 'Arial-Italic': 'Helvetica-Oblique',
+ 'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
+ 'Arial-BoldMT': 'Helvetica-Bold',
+ 'Arial-ItalicMT': 'Helvetica-Oblique',
+ 'ArialMT': 'Helvetica',
+ 'Courier-Bold': 'Courier-Bold',
+ 'Courier-BoldItalic': 'Courier-BoldOblique',
+ 'Courier-Italic': 'Courier-Oblique',
+ 'CourierNew': 'Courier',
+ 'CourierNew-Bold': 'Courier-Bold',
+ 'CourierNew-BoldItalic': 'Courier-BoldOblique',
+ 'CourierNew-Italic': 'Courier-Oblique',
+ 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
+ 'CourierNewPS-BoldMT': 'Courier-Bold',
+ 'CourierNewPS-ItalicMT': 'Courier-Oblique',
+ 'CourierNewPSMT': 'Courier',
+ 'Helvetica-Bold': 'Helvetica-Bold',
+ 'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
+ 'Helvetica-Italic': 'Helvetica-Oblique',
+ 'Symbol-Bold': 'Symbol',
+ 'Symbol-BoldItalic': 'Symbol',
+ 'Symbol-Italic': 'Symbol',
+ 'TimesNewRoman': 'Times-Roman',
+ 'TimesNewRoman-Bold': 'Times-Bold',
+ 'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRoman-Italic': 'Times-Italic',
+ 'TimesNewRomanPS': 'Times-Roman',
+ 'TimesNewRomanPS-Bold': 'Times-Bold',
+ 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldMT': 'Times-Bold',
+ 'TimesNewRomanPS-Italic': 'Times-Italic',
+ 'TimesNewRomanPS-ItalicMT': 'Times-Italic',
+ 'TimesNewRomanPSMT': 'Times-Roman',
+ 'TimesNewRomanPSMT-Bold': 'Times-Bold',
+ 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPSMT-Italic': 'Times-Italic'
+};
+
+var serifFonts = {
+ 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
+ 'Aldus': true, 'Alexandria': true, 'Algerian': true,
+ 'American Typewriter': true, 'Antiqua': true, 'Apex': true,
+ 'Arno': true, 'Aster': true, 'Aurora': true,
+ 'Baskerville': true, 'Bell': true, 'Bembo': true,
+ 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
+ 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
+ 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
+ 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
+ 'Calvert': true, 'Capitals': true, 'Cambria': true,
+ 'Cartier': true, 'Caslon': true, 'Catull': true,
+ 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
+ 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
+ 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
+ 'Cochin': true, 'Colonna': true, 'Computer Modern': true,
+ 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
+ 'Corona': true, 'Ecotype': true, 'Egyptienne': true,
+ 'Elephant': true, 'Excelsior': true, 'Fairfield': true,
+ 'FF Scala': true, 'Folkard': true, 'Footlight': true,
+ 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
+ 'Gentium': true, 'Georgia': true, 'Gloucester': true,
+ 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
+ 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
+ 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
+ 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
+ 'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
+ 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
+ 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
+ 'Lucida Bright': true, 'Melior': true, 'Memphis': true,
+ 'Miller': true, 'Minion': true, 'Modern': true,
+ 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
+ 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
+ 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
+ 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
+ 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
+ 'Requiem': true, 'Rockwell': true, 'Roman': true,
+ 'Rotis Serif': true, 'Sabon': true, 'Scala': true,
+ 'Seagull': true, 'Sistina': true, 'Souvenir': true,
+ 'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
+ 'Sylfaen': true, 'Times': true, 'Trajan': true,
+ 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
+ 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
+ 'Versailles': true, 'Wanted': true, 'Weiss': true,
+ 'Wide Latin': true, 'Windsor': true, 'XITS': true
+};
+
+var FontLoader = {
+ listeningForFontLoad: false,
+
+ bind: function fontLoaderBind(fonts, callback) {
+ function checkFontsLoaded() {
+ for (var i = 0, ii = objs.length; i < ii; i++) {
+ var fontObj = objs[i];
+ if (fontObj.loading) {
+ return false;
+ }
+ }
+
+ document.documentElement.removeEventListener(
+ 'pdfjsFontLoad', checkFontsLoaded, false);
+
+ callback();
+ return true;
+ }
+
+ var rules = [], names = [], objs = [];
+
+ for (var i = 0, ii = fonts.length; i < ii; i++) {
+ var font = fonts[i];
+
+ // If there is already a fontObj on the font, then it was loaded/attached
+ // to the page already and we don't have to do anything for this font
+ // here future.
+ if (font.fontObj) {
+ continue;
+ }
+
+ var obj = new Font(font.name, font.file, font.properties);
+
+ // Store the fontObj on the font such that `setFont` in CanvasGraphics
+ // can reuse it later again.
+ font.fontObj = obj;
+
+ objs.push(obj);
+
+ var str = '';
+ var data = obj.data;
+ if (data) {
+ var length = data.length;
+ for (var j = 0; j < length; j++)
+ str += String.fromCharCode(data[j]);
+
+ var rule = isWorker ? obj.bindWorker(str) : obj.bindDOM(str);
+ if (rule) {
+ rules.push(rule);
+ names.push(obj.loadedName);
+ }
+ }
+ }
+
+ this.listeningForFontLoad = false;
+ if (!isWorker && rules.length) {
+ FontLoader.prepareFontLoadEvent(rules, names, objs);
+ }
+
+ if (!checkFontsLoaded()) {
+ document.documentElement.addEventListener(
+ 'pdfjsFontLoad', checkFontsLoaded, false);
+ }
+
+ return objs;
+ },
+ // Set things up so that at least one pdfjsFontLoad event is
+ // dispatched when all the @font-face |rules| for |names| have been
+ // loaded in a subdocument. It's expected that the load of |rules|
+ // has already started in this (outer) document, so that they should
+ // be ordered before the load in the subdocument.
+ prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
+ objs) {
+ /** Hack begin */
+ // There's no event when a font has finished downloading so the
+ // following code is a dirty hack to 'guess' when a font is
+ // ready. This code will be obsoleted by Mozilla bug 471915.
+ //
+ // The only reliable way to know if a font is loaded in Gecko
+ // (at the moment) is document.onload in a document with
+ // a @font-face rule defined in a "static" stylesheet. We use a
+ // subdocument in an <iframe>, set up properly, to know when
+ // our @font-face rule was loaded. However, the subdocument and
+ // outer document can't share CSS rules, so the inner document
+ // is only part of the puzzle. The second piece is an invisible
+ // div created in order to force loading of the @font-face in
+ // the *outer* document. (The font still needs to be loaded for
+ // its metrics, for reflow). We create the div first for the
+ // outer document, then create the iframe. Unless something
+ // goes really wonkily, we expect the @font-face for the outer
+ // document to be processed before the inner. That's still
+ // fragile, but seems to work in practice.
+ //
+ // The postMessage() hackery was added to work around chrome bug
+ // 82402.
+
+ var div = document.createElement('div');
+ div.setAttribute('style',
+ 'visibility: hidden;' +
+ 'width: 10px; height: 10px;' +
+ 'position: absolute; top: 0px; left: 0px;');
+ var html = '';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ html += '<span style="font-family:' + names[i] + '">Hi</span>';
+ }
+ div.innerHTML = html;
+ document.body.appendChild(div);
+
+ if (!this.listeningForFontLoad) {
+ window.addEventListener(
+ 'message',
+ function fontLoaderMessage(e) {
+ var fontNames = JSON.parse(e.data);
+ for (var i = 0, ii = objs.length; i < ii; ++i) {
+ var font = objs[i];
+ font.loading = false;
+ }
+ var evt = document.createEvent('Events');
+ evt.initEvent('pdfjsFontLoad', true, false);
+ document.documentElement.dispatchEvent(evt);
+ },
+ false);
+ this.listeningForFontLoad = true;
+ }
+
+ // XXX we should have a time-out here too, and maybe fire
+ // pdfjsFontLoadFailed?
+ var src = '<!DOCTYPE HTML><html><head>';
+ src += '<style type="text/css">';
+ for (var i = 0, ii = rules.length; i < ii; ++i) {
+ src += rules[i];
+ }
+ src += '</style>';
+ src += '<script type="application/javascript">';
+ var fontNamesArray = '';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ fontNamesArray += '"' + names[i] + '", ';
+ }
+ src += ' var fontNames=[' + fontNamesArray + '];\n';
+ src += ' window.onload = function fontLoaderOnload() {\n';
+ src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n';
+ src += ' }';
+ src += '</script></head><body>';
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
+ }
+ src += '</body></html>';
+ var frame = document.createElement('iframe');
+ frame.src = 'data:text/html,' + src;
+ frame.setAttribute('style',
+ 'visibility: hidden;' +
+ 'width: 10px; height: 10px;' +
+ 'position: absolute; top: 0px; left: 0px;');
+ document.body.appendChild(frame);
+ /** Hack end */
+ }
+};
+
+var UnicodeRanges = [
+ { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
+ { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
+ { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
+ { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
+ { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
+ { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
+ { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
+ { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
+ { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
+ { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
+ { 'begin': 0x0530, 'end': 0x058F }, // Armenian
+ { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
+ { 'begin': 0xA500, 'end': 0xA63F }, // Vai
+ { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
+ { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
+ { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
+ { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
+ { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
+ { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
+ { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
+ { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
+ { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
+ { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
+ { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
+ { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
+ { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
+ { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
+ { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
+ { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
+ { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
+ { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
+ { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
+ { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
+ { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
+ { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
+ { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
+ { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
+ { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
+ { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
+ { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
+ { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
+ { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
+ { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
+ { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
+ { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
+ { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
+ { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
+ { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
+ { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
+ { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
+ { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
+ { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
+ { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
+ { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
+ { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
+ { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
+ { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
+ { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
+ { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
+ { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
+ { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
+ { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
+ { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
+ { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
+ { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
+ { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
+ { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
+ { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
+ { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
+ { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
+ { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
+ { 'begin': 0x0700, 'end': 0x074F }, // Syriac
+ { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
+ { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
+ { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
+ { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
+ { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
+ { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
+ { 'begin': 0x1680, 'end': 0x169F }, // Ogham
+ { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
+ { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
+ { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
+ { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
+ { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
+ { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
+ { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
+ { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
+ { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
+ { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
+ { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
+ { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
+ { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
+ { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
+ { 'begin': 0x1900, 'end': 0x194F }, // Limbu
+ { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
+ { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
+ { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
+ { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
+ { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
+ { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
+ { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
+ { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
+ { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
+ { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
+ { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
+ { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
+ { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
+ { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
+ { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
+ { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
+ { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
+ { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
+ { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
+ { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
+ { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
+ { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
+ { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
+ { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
+ { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
+ { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
+ { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
+ { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
+ { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles
+];
+
+var MacStandardGlyphOrdering = [
+ '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
+ 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+ 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
+ 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
+ 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+ 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
+ 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
+ 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
+ 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
+ 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
+ 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
+ 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
+ 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
+ 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+ 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+ 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+ 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
+ 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
+ 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
+ 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
+ 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
+ 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
+ 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
+ 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
+ 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
+ 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+
+function getUnicodeRangeFor(value) {
+ for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+ var range = UnicodeRanges[i];
+ if (value >= range.begin && value < range.end)
+ return i;
+ }
+ return -1;
+}
+
+function adaptUnicode(unicode) {
+ return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ?
+ unicode + kCmapGlyphOffset : unicode;
+}
+
+function isAdaptedUnicode(unicode) {
+ return unicode >= kCmapGlyphOffset &&
+ unicode < kCmapGlyphOffset + kSizeOfGlyphArea;
+}
+
+function isSpecialUnicode(unicode) {
+ return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
+ unicode >= kCmapGlyphOffset &&
+ unicode < kCmapGlyphOffset + kSizeOfGlyphArea;
+}
+
+/**
+ * 'Font' is the class the outside world should use, it encapsulate all the font
+ * decoding logics whatever type it is (assuming the font type is supported).
+ *
+ * For example to read a Type1 font and to attach it to the document:
+ * var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
+ * type1Font.bind();
+ */
+var Font = (function Font() {
+ var constructor = function font_constructor(name, file, properties) {
+ this.name = name;
+ this.coded = properties.coded;
+ this.charProcIRQueues = properties.charProcIRQueues;
+ this.resources = properties.resources;
+ this.sizes = [];
+
+ var names = name.split('+');
+ names = names.length > 1 ? names[1] : names[0];
+ names = names.split(/[-,_]/g)[0];
+ this.serif = serifFonts[names] || (name.search(/serif/gi) != -1);
+
+ var type = properties.type;
+ this.type = type;
+
+ // If the font is to be ignored, register it like an already loaded font
+ // to avoid the cost of waiting for it be be loaded by the platform.
+ if (properties.ignore) {
+ this.loadedName = this.serif ? 'serif' : 'sans-serif';
+ this.loading = false;
+ return;
+ }
+
+ this.differences = properties.differences;
+ this.widths = properties.widths;
+ this.defaultWidth = properties.defaultWidth;
+ this.composite = properties.composite;
+ this.toUnicode = properties.toUnicode;
+ this.hasEncoding = properties.hasEncoding;
+
+ this.fontMatrix = properties.fontMatrix;
+ if (properties.type == 'Type3')
+ return;
+
+ // Trying to fix encoding using glyph CIDSystemInfo.
+ this.loadCidToUnicode(properties);
+
+ if (!file) {
+ // The file data is not specified. Trying to fix the font name
+ // to be used with the canvas.font.
+ var fontName = name.replace(/[,_]/g, '-');
+ fontName = stdFontMap[fontName] || fontName;
+
+ this.bold = (fontName.search(/bold/gi) != -1);
+ this.italic = (fontName.search(/oblique/gi) != -1) ||
+ (fontName.search(/italic/gi) != -1);
+
+ // Use 'name' instead of 'fontName' here because the original
+ // name ArialBlack for example will be replaced by Helvetica.
+ this.black = (name.search(/Black/g) != -1);
+
+ this.encoding = properties.baseEncoding;
+ this.noUnicodeAdaptation = true;
+ this.loadedName = fontName.split('-')[0];
+ this.loading = false;
+ return;
+ }
+
+ var data;
+ switch (type) {
+ case 'Type1':
+ case 'CIDFontType0':
+ this.mimetype = 'font/opentype';
+
+ var subtype = properties.subtype;
+ var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
+ new Type2CFF(file, properties) : new CFF(name, file, properties);
+
+ // Wrap the CFF data inside an OTF font file
+ data = this.convert(name, cff, properties);
+ break;
+
+ case 'TrueType':
+ case 'CIDFontType2':
+ this.mimetype = 'font/opentype';
+
+ // Repair the TrueType file. It is can be damaged in the point of
+ // view of the sanitizer
+ data = this.checkAndRepair(name, file, properties);
+ break;
+
+ default:
+ warn('Font ' + properties.type + ' is not supported');
+ break;
+ }
+
+ this.data = data;
+ this.fontMatrix = properties.fontMatrix;
+ this.encoding = properties.baseEncoding;
+ this.hasShortCmap = properties.hasShortCmap;
+ this.loadedName = getUniqueName();
+ this.loading = true;
+ };
+
+ var numFonts = 0;
+ function getUniqueName() {
+ return 'pdfFont' + numFonts++;
+ }
+
+ function stringToArray(str) {
+ var array = [];
+ for (var i = 0, ii = str.length; i < ii; ++i)
+ array[i] = str.charCodeAt(i);
+
+ return array;
+ };
+
+ function arrayToString(arr) {
+ var str = '';
+ for (var i = 0, ii = arr.length; i < ii; ++i)
+ str += String.fromCharCode(arr[i]);
+
+ return str;
+ };
+
+ function int16(bytes) {
+ return (bytes[0] << 8) + (bytes[1] & 0xff);
+ };
+
+ function int32(bytes) {
+ return (bytes[0] << 24) + (bytes[1] << 16) +
+ (bytes[2] << 8) + (bytes[3] & 0xff);
+ };
+
+ function getMaxPower2(number) {
+ var maxPower = 0;
+ var value = number;
+ while (value >= 2) {
+ value /= 2;
+ maxPower++;
+ }
+
+ value = 2;
+ for (var i = 1; i < maxPower; i++)
+ value *= 2;
+ return value;
+ };
+
+ function string16(value) {
+ return String.fromCharCode((value >> 8) & 0xff) +
+ String.fromCharCode(value & 0xff);
+ };
+
+ function string32(value) {
+ return String.fromCharCode((value >> 24) & 0xff) +
+ String.fromCharCode((value >> 16) & 0xff) +
+ String.fromCharCode((value >> 8) & 0xff) +
+ String.fromCharCode(value & 0xff);
+ };
+
+ function createOpenTypeHeader(sfnt, file, numTables) {
+ // Windows hates the Mac TrueType sfnt version number
+ if (sfnt == 'true')
+ sfnt = string32(0x00010000);
+
+ // sfnt version (4 bytes)
+ var header = sfnt;
+
+ // numTables (2 bytes)
+ header += string16(numTables);
+
+ // searchRange (2 bytes)
+ var tablesMaxPower2 = getMaxPower2(numTables);
+ var searchRange = tablesMaxPower2 * 16;
+ header += string16(searchRange);
+
+ // entrySelector (2 bytes)
+ header += string16(Math.log(tablesMaxPower2) / Math.log(2));
+
+ // rangeShift (2 bytes)
+ header += string16(numTables * 16 - searchRange);
+
+ file.file += header;
+ file.virtualOffset += header.length;
+ };
+
+ function createTableEntry(file, tag, data) {
+ // offset
+ var offset = file.virtualOffset;
+
+ // length
+ var length = data.length;
+
+ // Per spec tables must be 4-bytes align so add padding as needed
+ while (data.length & 3)
+ data.push(0x00);
+
+ while (file.virtualOffset & 3)
+ file.virtualOffset++;
+
+ // checksum
+ var checksum = 0, n = data.length;
+ for (var i = 0; i < n; i += 4)
+ checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
+ data[i + 3]])) | 0;
+
+ var tableEntry = (tag + string32(checksum) +
+ string32(offset) + string32(length));
+ file.file += tableEntry;
+ file.virtualOffset += data.length;
+ };
+
+ function getRanges(glyphs) {
+ // Array.sort() sorts by characters, not numerically, so convert to an
+ // array of characters.
+ var codes = [];
+ var length = glyphs.length;
+ for (var n = 0; n < length; ++n)
+ codes.push({ unicode: glyphs[n].unicode, code: n });
+ codes.sort(function fontGetRangesSort(a, b) {
+ return a.unicode - b.unicode;
+ });
+
+ // Split the sorted codes into ranges.
+ var ranges = [];
+ for (var n = 0; n < length; ) {
+ var start = codes[n].unicode;
+ var startCode = codes[n].code;
+ ++n;
+ var end = start;
+ while (n < length && end + 1 == codes[n].unicode) {
+ ++end;
+ ++n;
+ }
+ var endCode = codes[n - 1].code;
+ ranges.push([start, end, startCode, endCode]);
+ }
+
+ return ranges;
+ };
+
+ function createCMapTable(glyphs, deltas) {
+ var ranges = getRanges(glyphs);
+
+ var numTables = 1;
+ var cmap = '\x00\x00' + // version
+ string16(numTables) + // numTables
+ '\x00\x03' + // platformID
+ '\x00\x01' + // encodingID
+ string32(4 + numTables * 8); // start of the table record
+
+ var segCount = ranges.length + 1;
+ var segCount2 = segCount * 2;
+ var searchRange = getMaxPower2(segCount) * 2;
+ var searchEntry = Math.log(segCount) / Math.log(2);
+ var rangeShift = 2 * segCount - searchRange;
+
+ // Fill up the 4 parallel arrays describing the segments.
+ var startCount = '';
+ var endCount = '';
+ var idDeltas = '';
+ var idRangeOffsets = '';
+ var glyphsIds = '';
+ var bias = 0;
+
+ if (deltas) {
+ for (var i = 0; i < segCount - 1; i++) {
+ var range = ranges[i];
+ var start = range[0];
+ var end = range[1];
+ var offset = (segCount - i) * 2 + bias * 2;
+ bias += (end - start + 1);
+
+ startCount += string16(start);
+ endCount += string16(end);
+ idDeltas += string16(0);
+ idRangeOffsets += string16(offset);
+
+ var startCode = range[2];
+ var endCode = range[3];
+ for (var j = startCode; j <= endCode; ++j)
+ glyphsIds += string16(deltas[j]);
+ }
+ } else {
+ for (var i = 0; i < segCount - 1; i++) {
+ var range = ranges[i];
+ var start = range[0];
+ var end = range[1];
+ var startCode = range[2];
+
+ startCount += string16(start);
+ endCount += string16(end);
+ idDeltas += string16((startCode - start + 1) & 0xFFFF);
+ idRangeOffsets += string16(0);
+ }
+ }
+
+ endCount += '\xFF\xFF';
+ startCount += '\xFF\xFF';
+ idDeltas += '\x00\x01';
+ idRangeOffsets += '\x00\x00';
+
+ var format314 = '\x00\x00' + // language
+ string16(segCount2) +
+ string16(searchRange) +
+ string16(searchEntry) +
+ string16(rangeShift) +
+ endCount + '\x00\x00' + startCount +
+ idDeltas + idRangeOffsets + glyphsIds;
+
+ return stringToArray(cmap +
+ '\x00\x04' + // format
+ string16(format314.length + 4) + // length
+ format314);
+ };
+
+ function createOS2Table(properties, charstrings, override) {
+ override = override || {
+ unitsPerEm: 0,
+ yMax: 0,
+ yMin: 0,
+ ascent: 0,
+ descent: 0
+ };
+
+ var ulUnicodeRange1 = 0;
+ var ulUnicodeRange2 = 0;
+ var ulUnicodeRange3 = 0;
+ var ulUnicodeRange4 = 0;
+
+ var firstCharIndex = null;
+ var lastCharIndex = 0;
+
+ if (charstrings) {
+ for (var i = 0; i < charstrings.length; ++i) {
+ var code = charstrings[i].unicode;
+ if (firstCharIndex > code || !firstCharIndex)
+ firstCharIndex = code;
+ if (lastCharIndex < code)
+ lastCharIndex = code;
+
+ var position = getUnicodeRangeFor(code);
+ if (position < 32) {
+ ulUnicodeRange1 |= 1 << position;
+ } else if (position < 64) {
+ ulUnicodeRange2 |= 1 << position - 32;
+ } else if (position < 96) {
+ ulUnicodeRange3 |= 1 << position - 64;
+ } else if (position < 123) {
+ ulUnicodeRange4 |= 1 << position - 96;
+ } else {
+ error('Unicode ranges Bits > 123 are reserved for internal usage');
+ }
+ }
+ } else {
+ // TODO
+ firstCharIndex = 0;
+ lastCharIndex = 255;
+ }
+
+ var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
+ var typoAscent = override.ascent || properties.ascent;
+ var typoDescent = override.descent || properties.descent;
+ var winAscent = override.yMax || typoAscent;
+ var winDescent = -override.yMin || -typoDescent;
+
+ // if there is a units per em value but no other override
+ // then scale the calculated ascent
+ if (unitsPerEm != kPDFGlyphSpaceUnits &&
+ 'undefined' == typeof(override.ascent)) {
+ // if the font units differ to the PDF glyph space units
+ // then scale up the values
+ typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
+ typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
+ winAscent = typoAscent;
+ winDescent = -typoDescent;
+ }
+
+ return '\x00\x03' + // version
+ '\x02\x24' + // xAvgCharWidth
+ '\x01\xF4' + // usWeightClass
+ '\x00\x05' + // usWidthClass
+ '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
+ '\x02\x8A' + // ySubscriptXSize
+ '\x02\xBB' + // ySubscriptYSize
+ '\x00\x00' + // ySubscriptXOffset
+ '\x00\x8C' + // ySubscriptYOffset
+ '\x02\x8A' + // ySuperScriptXSize
+ '\x02\xBB' + // ySuperScriptYSize
+ '\x00\x00' + // ySuperScriptXOffset
+ '\x01\xDF' + // ySuperScriptYOffset
+ '\x00\x31' + // yStrikeOutSize
+ '\x01\x02' + // yStrikeOutPosition
+ '\x00\x00' + // sFamilyClass
+ '\x00\x00\x06' +
+ String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
+ '\x00\x00\x00\x00\x00\x00' + // Panose
+ string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
+ string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
+ string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
+ string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
+ '\x2A\x32\x31\x2A' + // achVendID
+ string16(properties.italicAngle ? 1 : 0) + // fsSelection
+ string16(firstCharIndex ||
+ properties.firstChar) + // usFirstCharIndex
+ string16(lastCharIndex || properties.lastChar) + // usLastCharIndex
+ string16(typoAscent) + // sTypoAscender
+ string16(typoDescent) + // sTypoDescender
+ '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
+ string16(winAscent) + // usWinAscent
+ string16(winDescent) + // usWinDescent
+ '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
+ '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
+ string16(properties.xHeight) + // sxHeight
+ string16(properties.capHeight) + // sCapHeight
+ string16(0) + // usDefaultChar
+ string16(firstCharIndex || properties.firstChar) + // usBreakChar
+ '\x00\x03'; // usMaxContext
+ };
+
+ function createPostTable(properties) {
+ var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
+ return '\x00\x03\x00\x00' + // Version number
+ string32(angle) + // italicAngle
+ '\x00\x00' + // underlinePosition
+ '\x00\x00' + // underlineThickness
+ string32(properties.fixedPitch) + // isFixedPitch
+ '\x00\x00\x00\x00' + // minMemType42
+ '\x00\x00\x00\x00' + // maxMemType42
+ '\x00\x00\x00\x00' + // minMemType1
+ '\x00\x00\x00\x00'; // maxMemType1
+ };
+
+ function createNameTable(name) {
+ var strings = [
+ 'Original licence', // 0.Copyright
+ name, // 1.Font family
+ 'Unknown', // 2.Font subfamily (font weight)
+ 'uniqueID', // 3.Unique ID
+ name, // 4.Full font name
+ 'Version 0.11', // 5.Version
+ '', // 6.Postscript name
+ 'Unknown', // 7.Trademark
+ 'Unknown', // 8.Manufacturer
+ 'Unknown' // 9.Designer
+ ];
+
+ // Mac want 1-byte per character strings while Windows want
+ // 2-bytes per character, so duplicate the names table
+ var stringsUnicode = [];
+ for (var i = 0, ii = strings.length; i < ii; i++) {
+ var str = strings[i];
+
+ var strUnicode = '';
+ for (var j = 0, jj = str.length; j < jj; j++)
+ strUnicode += string16(str.charCodeAt(j));
+ stringsUnicode.push(strUnicode);
+ }
+
+ var names = [strings, stringsUnicode];
+ var platforms = ['\x00\x01', '\x00\x03'];
+ var encodings = ['\x00\x00', '\x00\x01'];
+ var languages = ['\x00\x00', '\x04\x09'];
+
+ var namesRecordCount = strings.length * platforms.length;
+ var nameTable =
+ '\x00\x00' + // format
+ string16(namesRecordCount) + // Number of names Record
+ string16(namesRecordCount * 12 + 6); // Storage
+
+ // Build the name records field
+ var strOffset = 0;
+ for (var i = 0, ii = platforms.length; i < ii; i++) {
+ var strs = names[i];
+ for (var j = 0, jj = strs.length; j < jj; j++) {
+ var str = strs[j];
+ var nameRecord =
+ platforms[i] + // platform ID
+ encodings[i] + // encoding ID
+ languages[i] + // language ID
+ string16(j) + // name ID
+ string16(str.length) +
+ string16(strOffset);
+ nameTable += nameRecord;
+ strOffset += str.length;
+ }
+ }
+
+ nameTable += strings.join('') + stringsUnicode.join('');
+ return nameTable;
+ }
+
+ constructor.prototype = {
+ name: null,
+ font: null,
+ mimetype: null,
+ encoding: null,
+
+ checkAndRepair: function font_checkAndRepair(name, font, properties) {
+ function readTableEntry(file) {
+ var tag = file.getBytes(4);
+ tag = String.fromCharCode(tag[0]) +
+ String.fromCharCode(tag[1]) +
+ String.fromCharCode(tag[2]) +
+ String.fromCharCode(tag[3]);
+
+ var checksum = int32(file.getBytes(4));
+ var offset = int32(file.getBytes(4));
+ var length = int32(file.getBytes(4));
+
+ // Read the table associated data
+ var previousPosition = file.pos;
+ file.pos = file.start ? file.start : 0;
+ file.skip(offset);
+ var data = file.getBytes(length);
+ file.pos = previousPosition;
+
+ if (tag == 'head') {
+ // clearing checksum adjustment
+ data[8] = data[9] = data[10] = data[11] = 0;
+ data[17] |= 0x20; //Set font optimized for cleartype flag
+ }
+
+ return {
+ tag: tag,
+ checksum: checksum,
+ length: length,
+ offset: offset,
+ data: data
+ };
+ };
+
+ function readOpenTypeHeader(ttf) {
+ return {
+ version: arrayToString(ttf.getBytes(4)),
+ numTables: int16(ttf.getBytes(2)),
+ searchRange: int16(ttf.getBytes(2)),
+ entrySelector: int16(ttf.getBytes(2)),
+ rangeShift: int16(ttf.getBytes(2))
+ };
+ };
+
+ function createGlyphNameMap(glyphs, ids, properties) {
+ var glyphNames = properties.glyphNames;
+ if (!glyphNames) {
+ properties.glyphNameMap = {};
+ return;
+ }
+ var glyphsLength = glyphs.length;
+ var glyphNameMap = {};
+ var encoding = [];
+ for (var i = 0; i < glyphsLength; ++i) {
+ var glyphName = glyphNames[ids[i]];
+ if (!glyphName)
+ continue;
+ var unicode = glyphs[i].unicode;
+ glyphNameMap[glyphName] = unicode;
+ var code = glyphs[i].code;
+ encoding[code] = glyphName;
+ }
+ properties.glyphNameMap = glyphNameMap;
+ if (!properties.hasEncoding)
+ properties.baseEncoding = encoding;
+ }
+
+ function replaceCMapTable(cmap, font, properties) {
+ var start = (font.start ? font.start : 0) + cmap.offset;
+ font.pos = start;
+
+ var version = int16(font.getBytes(2));
+ var numRecords = int16(font.getBytes(2));
+
+ var records = [];
+ for (var i = 0; i < numRecords; i++) {
+ records.push({
+ platformID: int16(font.getBytes(2)),
+ encodingID: int16(font.getBytes(2)),
+ offset: int32(font.getBytes(4))
+ });
+ }
+
+ // Check that table are sorted by platformID then encodingID,
+ records.sort(function fontReplaceCMapTableSort(a, b) {
+ return ((a.platformID << 16) + a.encodingID) -
+ ((b.platformID << 16) + b.encodingID);
+ });
+
+ var tables = [records[0]];
+ for (var i = 1; i < numRecords; i++) {
+ // The sanitizer will drop the font if 2 tables have the same
+ // platformID and the same encodingID, this will be correct for
+ // most cases but if the font has been made for Mac it could
+ // exist a few platformID: 1, encodingID: 0 but with a different
+ // language field and that's correct. But the sanitizer does not
+ // seem to support this case.
+ var current = records[i];
+ var previous = records[i - 1];
+ if (((current.platformID << 16) + current.encodingID) <=
+ ((previous.platformID << 16) + previous.encodingID))
+ continue;
+ tables.push(current);
+ }
+
+ var missing = numRecords - tables.length;
+ if (missing) {
+ numRecords = tables.length;
+ var data = string16(version) + string16(numRecords);
+
+ for (var i = 0; i < numRecords; i++) {
+ var table = tables[i];
+ data += string16(table.platformID) +
+ string16(table.encodingID) +
+ string32(table.offset);
+ }
+
+ for (var i = 0, ii = data.length; i < ii; i++)
+ cmap.data[i] = data.charCodeAt(i);
+ }
+
+ for (var i = 0; i < numRecords; i++) {
+ var table = tables[i];
+ font.pos = start + table.offset;
+
+ var format = int16(font.getBytes(2));
+ var length = int16(font.getBytes(2));
+ var language = int16(font.getBytes(2));
+
+ if (format == 0) {
+ // Characters below 0x20 are controls characters that are hardcoded
+ // into the platform so if some characters in the font are assigned
+ // under this limit they will not be displayed so let's rewrite the
+ // CMap.
+ var glyphs = [];
+ var ids = [];
+ for (var j = 0; j < 256; j++) {
+ var index = font.getByte();
+ if (index) {
+ var unicode = adaptUnicode(j);
+ glyphs.push({ unicode: unicode, code: j });
+ ids.push(index);
+ }
+ }
+
+ properties.hasShortCmap = true;
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ } else if (format == 4) {
+ // re-creating the table in format 4 since the encoding
+ // might be changed
+ var segCount = (int16(font.getBytes(2)) >> 1);
+ font.getBytes(6); // skipping range fields
+ var segIndex, segments = [];
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments.push({ end: int16(font.getBytes(2)) });
+ }
+ font.getBytes(2);
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].start = int16(font.getBytes(2));
+ }
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].delta = int16(font.getBytes(2));
+ }
+
+ var offsetsCount = 0;
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ var segment = segments[segIndex];
+ var rangeOffset = int16(font.getBytes(2));
+ if (!rangeOffset) {
+ segment.offsetIndex = -1;
+ continue;
+ }
+
+ var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+ segment.offsetIndex = offsetIndex;
+ offsetsCount = Math.max(offsetsCount, offsetIndex +
+ segment.end - segment.start + 1);
+ }
+
+ var offsets = [];
+ for (var j = 0; j < offsetsCount; j++)
+ offsets.push(int16(font.getBytes(2)));
+
+ var glyphs = [], ids = [];
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ var segment = segments[segIndex];
+ var start = segment.start, end = segment.end;
+ var delta = segment.delta, offsetIndex = segment.offsetIndex;
+
+ for (var j = start; j <= end; j++) {
+ if (j == 0xFFFF)
+ continue;
+
+ var glyphCode = offsetIndex < 0 ? j :
+ offsets[offsetIndex + j - start];
+ glyphCode = (glyphCode + delta) & 0xFFFF;
+ if (glyphCode == 0 || isAdaptedUnicode(j))
+ continue;
+
+ var unicode = adaptUnicode(j);
+ glyphs.push({ unicode: unicode, code: j });
+ ids.push(glyphCode);
+ }
+ }
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ } else if (format == 6) {
+ // Format 6 is a 2-bytes dense mapping, which means the font data
+ // lives glue together even if they are pretty far in the unicode
+ // table. (This looks weird, so I can have missed something), this
+ // works on Linux but seems to fails on Mac so let's rewrite the
+ // cmap table to a 3-1-4 style
+ var firstCode = int16(font.getBytes(2));
+ var entryCount = int16(font.getBytes(2));
+
+ var glyphs = [];
+ var ids = [];
+ for (var j = 0; j < entryCount; j++) {
+ var glyphCode = int16(font.getBytes(2));
+ var code = firstCode + j;
+ if (isAdaptedUnicode(glyphCode))
+ continue;
+
+ var unicode = adaptUnicode(code);
+ glyphs.push({ unicode: unicode, code: code });
+ ids.push(glyphCode);
+ }
+
+ createGlyphNameMap(glyphs, ids, properties);
+ return cmap.data = createCMapTable(glyphs, ids);
+ }
+ }
+ return cmap.data;
+ };
+
+ function sanitizeMetrics(font, header, metrics, numGlyphs) {
+ if (!header && !metrics)
+ return;
+
+ // The vhea/vmtx tables are not required, so it happens that
+ // some fonts embed a vmtx table without a vhea table. In this
+ // situation the sanitizer assume numOfLongVerMetrics = 1. As
+ // a result it tries to read numGlyphs - 1 SHORT from the vmtx
+ // table, and if it is not possible, the font is rejected.
+ // So remove the vmtx table if there is no vhea table.
+ if (!header && metrics) {
+ metrics.data = null;
+ return;
+ }
+
+ font.pos = (font.start ? font.start : 0) + header.offset;
+ font.pos += header.length - 2;
+ var numOfMetrics = int16(font.getBytes(2));
+
+ var numOfSidebearings = numGlyphs - numOfMetrics;
+ var numMissing = numOfSidebearings -
+ ((hmtx.length - numOfMetrics * 4) >> 1);
+ if (numMissing > 0) {
+ font.pos = (font.start ? font.start : 0) + metrics.offset;
+ var entries = '';
+ for (var i = 0, ii = hmtx.length; i < ii; i++)
+ entries += String.fromCharCode(font.getByte());
+ for (var i = 0; i < numMissing; i++)
+ entries += '\x00\x00';
+ metrics.data = stringToArray(entries);
+ }
+ };
+
+ function sanitizeGlyphLocations(loca, glyf, numGlyphs,
+ isGlyphLocationsLong) {
+ var itemSize, itemDecode, itemEncode;
+ if (isGlyphLocationsLong) {
+ itemSize = 4;
+ itemDecode = function fontItemDecodeLong(data, offset) {
+ return (data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3];
+ };
+ itemEncode = function fontItemEncodeLong(data, offset, value) {
+ data[offset] = (value >>> 24) & 0xFF;
+ data[offset + 1] = (value >> 16) & 0xFF;
+ data[offset + 2] = (value >> 8) & 0xFF;
+ data[offset + 3] = value & 0xFF;
+ };
+ } else {
+ itemSize = 2;
+ itemDecode = function fontItemDecode(data, offset) {
+ return (data[offset] << 9) | (data[offset + 1] << 1);
+ };
+ itemEncode = function fontItemEncode(data, offset, value) {
+ data[offset] = (value >> 9) & 0xFF;
+ data[offset + 1] = (value >> 1) & 0xFF;
+ };
+ }
+ var locaData = loca.data;
+ var startOffset = itemDecode(locaData, 0);
+ var firstOffset = itemDecode(locaData, itemSize);
+ if (firstOffset - startOffset < 12 || startOffset > 0) {
+ // removing first glyph
+ glyf.data = glyf.data.subarray(firstOffset);
+ glyf.length -= firstOffset;
+
+ itemEncode(locaData, 0, 0);
+ var i, pos = itemSize;
+ for (i = 1; i <= numGlyphs; ++i) {
+ itemEncode(locaData, pos,
+ itemDecode(locaData, pos) - firstOffset);
+ pos += itemSize;
+ }
+ }
+ }
+
+ function readGlyphNameMap(post, properties) {
+ var start = (font.start ? font.start : 0) + post.offset;
+ font.pos = start;
+
+ var length = post.length, end = start + length;
+ var version = int32(font.getBytes(4));
+ // skip rest to the tables
+ font.getBytes(28);
+
+ var glyphNames;
+ switch (version) {
+ case 0x00010000:
+ glyphNames = MacStandardGlyphOrdering;
+ break;
+ case 0x00020000:
+ var numGlyphs = int16(font.getBytes(2));
+ var glyphNameIndexes = [];
+ for (var i = 0; i < numGlyphs; ++i)
+ glyphNameIndexes.push(int16(font.getBytes(2)));
+ var customNames = [];
+ while (font.pos < end) {
+ var stringLength = font.getByte();
+ var string = '';
+ for (var i = 0; i < stringLength; ++i)
+ string += font.getChar();
+ customNames.push(string);
+ }
+ glyphNames = [];
+ for (var i = 0; i < numGlyphs; ++i) {
+ var j = glyphNameIndexes[i];
+ if (j < 258) {
+ glyphNames.push(MacStandardGlyphOrdering[j]);
+ continue;
+ }
+ glyphNames.push(customNames[j - 258]);
+ }
+ break;
+ case 0x00030000:
+ break;
+ default:
+ warn('Unknown/unsupported post table version ' + version);
+ break;
+ }
+ properties.glyphNames = glyphNames;
+ }
+
+ // Check that required tables are present
+ var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
+ 'hmtx', 'maxp', 'name', 'post'];
+
+ var header = readOpenTypeHeader(font);
+ var numTables = header.numTables;
+
+ var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf;
+ var tables = [];
+ for (var i = 0; i < numTables; i++) {
+ var table = readTableEntry(font);
+ var index = requiredTables.indexOf(table.tag);
+ if (index != -1) {
+ if (table.tag == 'cmap')
+ cmap = table;
+ else if (table.tag == 'post')
+ post = table;
+ else if (table.tag == 'maxp')
+ maxp = table;
+ else if (table.tag == 'hhea')
+ hhea = table;
+ else if (table.tag == 'hmtx')
+ hmtx = table;
+ else if (table.tag == 'head')
+ head = table;
+
+ requiredTables.splice(index, 1);
+ } else {
+ if (table.tag == 'vmtx')
+ vmtx = table;
+ else if (table.tag == 'vhea')
+ vhea = table;
+ else if (table.tag == 'loca')
+ loca = table;
+ else if (table.tag == 'glyf')
+ glyf = table;
+ }
+ tables.push(table);
+ }
+
+ var numTables = header.numTables + requiredTables.length;
+
+ // header and new offsets. Table entry information is appended to the
+ // end of file. The virtualOffset represents where to put the actual
+ // data of a particular table;
+ var ttf = {
+ file: '',
+ virtualOffset: numTables * (4 * 4)
+ };
+
+ // The new numbers of tables will be the last one plus the num
+ // of missing tables
+ createOpenTypeHeader(header.version, ttf, numTables);
+
+ if (requiredTables.indexOf('OS/2') != -1) {
+ // extract some more font properties from the OpenType head and
+ // hhea tables; yMin and descent value are always negative
+ var override = {
+ unitsPerEm: int16([head.data[18], head.data[19]]),
+ yMax: int16([head.data[42], head.data[43]]),
+ yMin: int16([head.data[38], head.data[39]]) - 0x10000,
+ ascent: int16([hhea.data[4], hhea.data[5]]),
+ descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
+ };
+
+ tables.push({
+ tag: 'OS/2',
+ data: stringToArray(createOS2Table(properties, null, override))
+ });
+ }
+
+ // Ensure the [h/v]mtx tables contains the advance width and
+ // sidebearings information for numGlyphs in the maxp table
+ font.pos = (font.start || 0) + maxp.offset;
+ var version = int16(font.getBytes(4));
+ var numGlyphs = int16(font.getBytes(2));
+
+ sanitizeMetrics(font, hhea, hmtx, numGlyphs);
+ sanitizeMetrics(font, vhea, vmtx, numGlyphs);
+
+ if (head && loca && glyf) {
+ var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
+ sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
+ }
+
+ // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
+ // Sometimes it's 0. That needs to be fixed
+ if (hhea.data[10] == 0 && hhea.data[11] == 0) {
+ hhea.data[10] = 0xFF;
+ hhea.data[11] = 0xFF;
+ }
+
+ // The 'post' table has glyphs names.
+ if (post) {
+ readGlyphNameMap(post, properties);
+ }
+
+ // Replace the old CMAP table with a shiny new one
+ if (properties.type == 'CIDFontType2') {
+ // Type2 composite fonts map characters directly to glyphs so the cmap
+ // table must be replaced.
+ // canvas fillText will reencode some characters even if the font has a
+ // glyph at that position - e.g. newline is converted to a space and
+ // U+00AD (soft hyphen) is not drawn.
+ // So, offset all the glyphs by 0xFF to avoid these cases and use
+ // the encoding to map incoming characters to the new glyph positions
+ if (!cmap) {
+ cmap = {
+ tag: 'cmap',
+ data: null
+ };
+ tables.push(cmap);
+ }
+
+ var glyphs = [];
+ for (i = 1; i < numGlyphs; i++) {
+ if (isAdaptedUnicode(i))
+ continue;
+
+ glyphs.push({ unicode: adaptUnicode(i) });
+ }
+ cmap.data = createCMapTable(glyphs);
+ } else {
+ replaceCMapTable(cmap, font, properties);
+ this.glyphNameMap = properties.glyphNameMap;
+ }
+
+ // Rewrite the 'post' table if needed
+ if (requiredTables.indexOf('post') != -1) {
+ tables.push({
+ tag: 'post',
+ data: stringToArray(createPostTable(properties))
+ });
+ }
+
+ // Rewrite the 'name' table if needed
+ if (requiredTables.indexOf('name') != -1) {
+ tables.push({
+ tag: 'name',
+ data: stringToArray(createNameTable(this.name))
+ });
+ }
+
+ // Tables needs to be written by ascendant alphabetic order
+ tables.sort(function tables_sort(a, b) {
+ return (a.tag > b.tag) - (a.tag < b.tag);
+ });
+
+ // rewrite the tables but tweak offsets
+ for (var i = 0, ii = tables.length; i < ii; i++) {
+ var table = tables[i];
+ var data = [];
+
+ var tableData = table.data;
+ for (var j = 0, jj = tableData.length; j < jj; j++)
+ data.push(tableData[j]);
+ createTableEntry(ttf, table.tag, data);
+ }
+
+ // Add the table datas
+ for (var i = 0, ii = tables.length; i < ii; i++) {
+ var table = tables[i];
+ var tableData = table.data;
+ ttf.file += arrayToString(tableData);
+
+ // 4-byte aligned data
+ while (ttf.file.length & 3)
+ ttf.file += String.fromCharCode(0);
+ }
+
+ return stringToArray(ttf.file);
+ },
+
+ convert: function font_convert(fontName, font, properties) {
+ function isFixedPitch(glyphs) {
+ for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
+ if (glyphs[i] != glyphs[i + 1])
+ return false;
+ }
+ return true;
+ }
+
+ // The offsets object holds at the same time a representation of where
+ // to write the table entry information about a table and another offset
+ // representing the offset where to draw the actual data of a particular
+ // table
+ var kRequiredTablesCount = 9;
+
+ var otf = {
+ file: '',
+ virtualOffset: 9 * (4 * 4)
+ };
+
+ createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
+
+ var charstrings = font.charstrings;
+ properties.fixedPitch = isFixedPitch(charstrings);
+
+ var glyphNameMap = {};
+ for (var i = 0; i < charstrings.length; ++i) {
+ var charstring = charstrings[i];
+ glyphNameMap[charstring.glyph] = charstring.unicode;
+ }
+ this.glyphNameMap = glyphNameMap;
+
+ if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
+ properties.subtype == 'CIDFontType0C')) {
+ var encoding = [];
+ for (var i = 0; i < charstrings.length; ++i) {
+ var charstring = charstrings[i];
+ encoding[charstring.code] = charstring.glyph;
+ }
+ properties.baseEncoding = encoding;
+ }
+
+ var fields = {
+ // PostScript Font Program
+ 'CFF ': font.data,
+
+ // OS/2 and Windows Specific metrics
+ 'OS/2': stringToArray(createOS2Table(properties, charstrings)),
+
+ // Character to glyphs mapping
+ 'cmap': createCMapTable(charstrings.slice(),
+ ('glyphIds' in font) ? font.glyphIds : null),
+
+ // Font header
+ 'head': (function fontFieldsHead() {
+ return stringToArray(
+ '\x00\x01\x00\x00' + // Version number
+ '\x00\x00\x10\x00' + // fontRevision
+ '\x00\x00\x00\x00' + // checksumAdjustement
+ '\x5F\x0F\x3C\xF5' + // magicNumber
+ '\x00\x00' + // Flags
+ '\x03\xE8' + // unitsPerEM (defaulting to 1000)
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
+ '\x00\x00' + // xMin
+ string16(properties.descent) + // yMin
+ '\x0F\xFF' + // xMax
+ string16(properties.ascent) + // yMax
+ string16(properties.italicAngle ? 2 : 0) + // macStyle
+ '\x00\x11' + // lowestRecPPEM
+ '\x00\x00' + // fontDirectionHint
+ '\x00\x00' + // indexToLocFormat
+ '\x00\x00'); // glyphDataFormat
+ })(),
+
+ // Horizontal header
+ 'hhea': (function fontFieldsHhea() {
+ return stringToArray(
+ '\x00\x01\x00\x00' + // Version number
+ string16(properties.ascent) + // Typographic Ascent
+ string16(properties.descent) + // Typographic Descent
+ '\x00\x00' + // Line Gap
+ '\xFF\xFF' + // advanceWidthMax
+ '\x00\x00' + // minLeftSidebearing
+ '\x00\x00' + // minRightSidebearing
+ '\x00\x00' + // xMaxExtent
+ string16(properties.capHeight) + // caretSlopeRise
+ string16(Math.tan(properties.italicAngle) *
+ properties.xHeight) + // caretSlopeRun
+ '\x00\x00' + // caretOffset
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // metricDataFormat
+ string16(charstrings.length + 1)); // Number of HMetrics
+ })(),
+
+ // Horizontal metrics
+ 'hmtx': (function fontFieldsHmtx() {
+ var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
+ for (var i = 0, ii = charstrings.length; i < ii; i++)
+ hmtx += string16(charstrings[i].width) + string16(0);
+ return stringToArray(hmtx);
+ })(),
+
+ // Maximum profile
+ 'maxp': (function fontFieldsMaxp() {
+ return stringToArray(
+ '\x00\x00\x50\x00' + // Version number
+ string16(charstrings.length + 1)); // Num of glyphs
+ })(),
+
+ // Naming tables
+ 'name': stringToArray(createNameTable(fontName)),
+
+ // PostScript informations
+ 'post': stringToArray(createPostTable(properties))
+ };
+
+ for (var field in fields)
+ createTableEntry(otf, field, fields[field]);
+
+ for (var field in fields) {
+ var table = fields[field];
+ otf.file += arrayToString(table);
+ }
+
+ return stringToArray(otf.file);
+ },
+
+ loadCidToUnicode: function font_loadCidToUnicode(properties) {
+ if (properties.cidToGidMap) {
+ this.cidToUnicode = properties.cidToGidMap;
+ return;
+ }
+
+ if (!properties.cidSystemInfo)
+ return;
+
+ var cidToUnicodeMap = [];
+ this.cidToUnicode = cidToUnicodeMap;
+
+ var cidSystemInfo = properties.cidSystemInfo;
+ var cidToUnicode;
+ if (cidSystemInfo) {
+ cidToUnicode = CIDToUnicodeMaps[
+ cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
+ }
+
+ if (!cidToUnicode)
+ return; // identity encoding
+
+ var glyph = 1, i, j, k, ii;
+ for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
+ var unicode = cidToUnicode[i];
+ if (isArray(unicode)) {
+ var length = unicode.length;
+ for (j = 0; j < length; j++)
+ cidToUnicodeMap[unicode[j]] = glyph;
+ glyph++;
+ } else if (typeof unicode === 'object') {
+ var fillLength = unicode.f;
+ if (fillLength) {
+ k = unicode.c;
+ for (j = 0; j < fillLength; ++j) {
+ cidToUnicodeMap[k] = glyph++;
+ k++;
+ }
+ } else
+ glyph += unicode.s;
+ } else if (unicode) {
+ cidToUnicodeMap[unicode] = glyph++;
+ } else
+ glyph++;
+ }
+ },
+
+ bindWorker: function font_bindWorker(data) {
+ postMessage({
+ action: 'font',
+ data: {
+ raw: data,
+ fontName: this.loadedName,
+ mimetype: this.mimetype
+ }
+ });
+ },
+
+ bindDOM: function font_bindDom(data) {
+ var fontName = this.loadedName;
+
+ // Add the font-face rule to the document
+ var url = ('url(data:' + this.mimetype + ';base64,' +
+ window.btoa(data) + ');');
+ var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
+
+ document.documentElement.firstChild.appendChild(
+ document.createElement('style'));
+
+ var styleSheet = document.styleSheets[document.styleSheets.length - 1];
+ styleSheet.insertRule(rule, styleSheet.cssRules.length);
+
+ return rule;
+ },
+
+ charToGlyph: function fonts_charToGlyph(charcode) {
+ var unicode, width, codeIRQueue;
+
+ var width = this.widths[charcode];
+
+ switch (this.type) {
+ case 'CIDFontType0':
+ if (this.noUnicodeAdaptation) {
+ width = this.widths[this.cidToUnicode[charcode]];
+ unicode = charcode;
+ break;
+ }
+ unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode);
+ break;
+ case 'CIDFontType2':
+ if (this.noUnicodeAdaptation) {
+ width = this.widths[this.cidToUnicode[charcode]];
+ unicode = charcode;
+ break;
+ }
+ unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode);
+ break;
+ case 'Type1':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ if (this.noUnicodeAdaptation) {
+ if (!isNum(width))
+ width = this.widths[glyphName];
+ unicode = GlyphsUnicode[glyphName] || charcode;
+ break;
+ }
+ unicode = this.glyphNameMap[glyphName] ||
+ adaptUnicode(GlyphsUnicode[glyphName] || charcode);
+ break;
+ case 'Type3':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ codeIRQueue = this.charProcIRQueues[glyphName];
+ unicode = charcode;
+ break;
+ case 'TrueType':
+ var glyphName = this.differences[charcode] || this.encoding[charcode];
+ if (!glyphName)
+ glyphName = Encodings.StandardEncoding[charcode];
+ if (!isNum(width))
+ width = this.widths[glyphName];
+ if (this.noUnicodeAdaptation) {
+ unicode = GlyphsUnicode[glyphName] || charcode;
+ break;
+ }
+ if (!this.hasEncoding) {
+ unicode = adaptUnicode(charcode);
+ break;
+ }
+ if (this.hasShortCmap) {
+ var j = Encodings.MacRomanEncoding.indexOf(glyphName);
+ unicode = j >= 0 && !isSpecialUnicode(j) ? j :
+ this.glyphNameMap[glyphName];
+ } else {
+ unicode = glyphName in GlyphsUnicode ?
+ adaptUnicode(GlyphsUnicode[glyphName]) :
+ this.glyphNameMap[glyphName];
+ }
+ break;
+ default:
+ warn('Unsupported font type: ' + this.type);
+ break;
+ }
+ return {
+ unicode: unicode,
+ width: isNum(width) ? width : this.defaultWidth,
+ codeIRQueue: codeIRQueue
+ };
+ },
+
+ charsToGlyphs: function fonts_chars2Glyphs(chars) {
+ var charsCache = this.charsCache;
+ var glyphs;
+
+ // if we translated this string before, just grab it from the cache
+ if (charsCache) {
+ glyphs = charsCache[chars];
+ if (glyphs)
+ return glyphs;
+ }
+
+ // lazily create the translation cache
+ if (!charsCache)
+ charsCache = this.charsCache = Object.create(null);
+
+ glyphs = [];
+
+ if (this.composite) {
+ // composite fonts have multi-byte strings convert the string from
+ // single-byte to multi-byte
+ // XXX assuming CIDFonts are two-byte - later need to extract the
+ // correct byte encoding according to the PDF spec
+ var length = chars.length - 1; // looping over two bytes at a time so
+ // loop should never end on the last byte
+ for (var i = 0; i < length; i++) {
+ var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
+ var glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ // placing null after each word break charcode (ASCII SPACE)
+ if (charcode == 0x20)
+ glyphs.push(null);
+ }
+ }
+ else {
+ for (var i = 0, ii = chars.length; i < ii; ++i) {
+ var charcode = chars.charCodeAt(i);
+ var glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ if (charcode == 0x20)
+ glyphs.push(null);
+ }
+ }
+
+ // Enter the translated string into the cache
+ return (charsCache[chars] = glyphs);
+ }
+ };
+
+ return constructor;
+})();
+
+/*
+ * Type1Parser encapsulate the needed code for parsing a Type1 font
+ * program. Some of its logic depends on the Type2 charstrings
+ * structure.
+ */
+var Type1Parser = function type1Parser() {
+ /*
+ * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
+ * of Plaintext Bytes. The function took a key as a parameter which can be
+ * for decrypting the eexec block of for decoding charStrings.
+ */
+ var kEexecEncryptionKey = 55665;
+ var kCharStringsEncryptionKey = 4330;
+
+ function decrypt(stream, key, discardNumber) {
+ var r = key, c1 = 52845, c2 = 22719;
+ var decryptedString = [];
+
+ var value = '';
+ var count = stream.length;
+ for (var i = 0; i < count; i++) {
+ value = stream[i];
+ decryptedString[i] = value ^ (r >> 8);
+ r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+ }
+ return decryptedString.slice(discardNumber);
+ }
+
+ /*
+ * CharStrings are encoded following the the CharString Encoding sequence
+ * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
+ * The value in a byte indicates a command, a number, or subsequent bytes
+ * that are to be interpreted in a special way.
+ *
+ * CharString Number Encoding:
+ * A CharString byte containing the values from 32 through 255 inclusive
+ * indicate an integer. These values are decoded in four ranges.
+ *
+ * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
+ * indicate the integer v - 139. Thus, the integer values from -107 through
+ * 107 inclusive may be encoded in single byte.
+ *
+ * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * [(v - 247) x 256] + w + 108
+ *
+ * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * -[(v - 251) * 256] - w - 108
+ *
+ * 4. A CharString containing the value 255 indicates that the next 4 bytes
+ * are a two complement signed integer. The first of these bytes contains the
+ * highest order bits, the second byte contains the next higher order bits
+ * and the fourth byte contain the lowest order bits.
+ *
+ *
+ * CharString Command Encoding:
+ * CharStrings commands are encoded in 1 or 2 bytes.
+ *
+ * Single byte commands are encoded in 1 byte that contains a value between
+ * 0 and 31 inclusive.
+ * If a command byte contains the value 12, then the value in the next byte
+ * indicates a command. This "escape" mechanism allows many extra commands
+ * to be encoded and this encoding technique helps to minimize the length of
+ * the charStrings.
+ */
+ var charStringDictionary = {
+ '1': 'hstem',
+ '3': 'vstem',
+ '4': 'vmoveto',
+ '5': 'rlineto',
+ '6': 'hlineto',
+ '7': 'vlineto',
+ '8': 'rrcurveto',
+
+ // closepath is a Type1 command that do not take argument and is useless
+ // in Type2 and it can simply be ignored.
+ '9': null, // closepath
+
+ '10': 'callsubr',
+
+ // return is normally used inside sub-routines to tells to the execution
+ // flow that it can be back to normal.
+ // During the translation process Type1 charstrings will be flattened and
+ // sub-routines will be embedded directly into the charstring directly, so
+ // this can be ignored safely.
+ '11': 'return',
+
+ '12': {
+ // dotsection is a Type1 command to specify some hinting feature for dots
+ // that do not take a parameter and it can safely be ignored for Type2.
+ '0': null, // dotsection
+
+ // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
+ // parameters, so instead of returning [vh]stem3 take a shortcut and
+ // return [vhstem] instead.
+ '1': 'vstem',
+ '2': 'hstem',
+
+ // Type1 only command with command not (yet) built-in ,throw an error
+ '6': -1, // seac
+ '7': -1, // sbw
+
+ '11': 'sub',
+ '12': 'div',
+
+ // callothersubr is a mechanism to make calls on the postscript
+ // interpreter, this is not supported by Type2 charstring but hopefully
+ // most of the default commands can be ignored safely.
+ '16': 'callothersubr',
+
+ '17': 'pop',
+
+ // setcurrentpoint sets the current point to x, y without performing a
+ // moveto (this is a one shot positionning command). This is used only
+ // with the return of an OtherSubrs call.
+ // TODO Implement the OtherSubrs charstring embedding and replace this
+ // call by a no-op, like 2 'pop' commands for example.
+ '33': null // setcurrentpoint
+ },
+ '13': 'hsbw',
+ '14': 'endchar',
+ '21': 'rmoveto',
+ '22': 'hmoveto',
+ '30': 'vhcurveto',
+ '31': 'hvcurveto'
+ };
+
+ var kEscapeCommand = 12;
+
+ function decodeCharString(array) {
+ var charstring = [];
+ var lsb = 0;
+ var width = 0;
+ var flexState = 0;
+
+ var value = '';
+ var count = array.length;
+ for (var i = 0; i < count; i++) {
+ value = array[i];
+
+ if (value < 32) {
+ var command = null;
+ if (value == kEscapeCommand) {
+ var escape = array[++i];
+
+ // TODO Clean this code
+ if (escape == 16) {
+ var index = charstring.pop();
+ var argc = charstring.pop();
+ for (var j = 0; j < argc; j++)
+ charstring.push('drop');
+
+ // If the flex mechanism is not used in a font program, Adobe
+ // states that entries 0, 1 and 2 can simply be replaced by
+ // {}, which means that we can simply ignore them.
+ if (index < 3) {
+ continue;
+ }
+
+ // This is the same things about hint replacement, if it is not used
+ // entry 3 can be replaced by {3}
+ // TODO support hint replacment
+ if (index == 3) {
+ charstring.push(3);
+ i++;
+ continue;
+ }
+ } else if (escape == 17 || escape == 33) {
+ // pop or setcurrentpoint commands can be ignored
+ // since we are not doing callothersubr
+ continue;
+ } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
+ charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
+ continue;
+ }
+
+ command = charStringDictionary['12'][escape];
+ } else {
+ // TODO Clean this code
+ if (value == 13) { // hsbw
+ if (charstring.length == 2) {
+ lsb = charstring[0];
+ width = charstring[1];
+ charstring.splice(0, 1);
+ } else if (charstring.length == 4 && charstring[3] == 'div') {
+ lsb = charstring[0];
+ width = charstring[1] / charstring[2];
+ charstring.splice(0, 1);
+ } else if (charstring.length == 4 && charstring[2] == 'div') {
+ lsb = charstring[0] / charstring[1];
+ width = charstring[3];
+ charstring.splice(0, 3);
+ } else {
+ error('Unsupported hsbw format: ' + charstring);
+ }
+
+ charstring.push(lsb, 'hmoveto');
+ continue;
+ } else if (value == 10) { // callsubr
+ if (charstring[charstring.length - 1] < 3) { // subr #0..2
+ var subrNumber = charstring.pop();
+ switch (subrNumber) {
+ case 1:
+ flexState = 1; // prepare for flex coordinates
+ break;
+ case 2:
+ flexState = 2; // flex in progress
+ break;
+ case 0:
+ // type2 flex command does not need final coords
+ charstring.push('exch', 'drop', 'exch', 'drop');
+ charstring.push('flex');
+ flexState = 0;
+ break;
+ }
+ continue;
+ }
+ } else if (value == 21 && flexState > 0) {
+ if (flexState > 1)
+ continue; // ignoring rmoveto
+ value = 5; // first segment replacing with rlineto
+ } else if (!kHintingEnabled && (value == 1 || value == 3)) {
+ charstring.push('drop', 'drop');
+ continue;
+ }
+ command = charStringDictionary[value];
+ }
+
+ // Some charstring commands are meaningless in Type2 and will return
+ // a null, let's just ignored them
+ if (!command && i < count) {
+ continue;
+ } else if (!command) {
+ break;
+ } else if (command == -1) {
+ warn('Support for Type1 command ' + value +
+ ' (' + escape + ') is not implemented in charstring: ' +
+ charstring);
+ if (value == 12) {
+ // we know how to ignore only some the Type1 commands
+ switch (escape) {
+ case 7:
+ charstring.push('drop', 'drop', 'drop', 'drop');
+ continue;
+ case 8:
+ charstring.push('drop');
+ continue;
+ }
+ }
+ }
+
+ value = command;
+ } else if (value <= 246) {
+ value = value - 139;
+ } else if (value <= 250) {
+ value = ((value - 247) * 256) + array[++i] + 108;
+ } else if (value <= 254) {
+ value = -((value - 251) * 256) - array[++i] - 108;
+ } else {
+ value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
+ (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
+ }
+
+ charstring.push(value);
+ }
+
+ return { charstring: charstring, width: width, lsb: lsb };
+ }
+
+ /*
+ * Returns an object containing a Subrs array and a CharStrings
+ * array extracted from and eexec encrypted block of data
+ */
+ function readNumberArray(str, index) {
+ var start = index;
+ while (str[index++] != '[')
+ start++;
+ start++;
+
+ var count = 0;
+ while (str[index++] != ']')
+ count++;
+
+ var array = str.substr(start, count).split(' ');
+ for (var i = 0, ii = array.length; i < ii; i++)
+ array[i] = parseFloat(array[i] || 0);
+ return array;
+ }
+
+ function readNumber(str, index) {
+ while (str[index] == ' ')
+ index++;
+
+ var start = index;
+
+ var count = 0;
+ while (str[index++] != ' ')
+ count++;
+
+ return parseFloat(str.substr(start, count) || 0);
+ }
+
+ function isSeparator(c) {
+ return c == ' ' || c == '\n' || c == '\x0d';
+ }
+
+ this.extractFontProgram = function t1_extractFontProgram(stream) {
+ var eexec = decrypt(stream, kEexecEncryptionKey, 4);
+ var eexecStr = '';
+ for (var i = 0, ii = eexec.length; i < ii; i++)
+ eexecStr += String.fromCharCode(eexec[i]);
+
+ var glyphsSection = false, subrsSection = false;
+ var program = {
+ subrs: [],
+ charstrings: [],
+ properties: {
+ 'private': {
+ 'lenIV': 4
+ }
+ }
+ };
+
+ var glyph = '';
+ var token = '';
+ var length = 0;
+
+ var c = '';
+ var count = eexecStr.length;
+ for (var i = 0; i < count; i++) {
+ var getToken = function getToken() {
+ while (i < count && isSeparator(eexecStr[i]))
+ ++i;
+
+ var token = '';
+ while (i < count && !isSeparator(eexecStr[i]))
+ token += eexecStr[i++];
+
+ return token;
+ };
+ var c = eexecStr[i];
+
+ if ((glyphsSection || subrsSection) &&
+ (token == 'RD' || token == '-|')) {
+ i++;
+ var data = eexec.slice(i, i + length);
+ var lenIV = program.properties.private['lenIV'];
+ var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+ var str = decodeCharString(encoded);
+
+ if (glyphsSection) {
+ program.charstrings.push({
+ glyph: glyph,
+ data: str.charstring,
+ lsb: str.lsb,
+ width: str.width
+ });
+ } else {
+ program.subrs.push(str.charstring);
+ }
+ i += length;
+ token = '';
+ } else if (isSeparator(c)) {
+ length = parseInt(token, 10);
+ token = '';
+ } else {
+ token += c;
+ if (!glyphsSection) {
+ switch (token) {
+ case '/CharString':
+ glyphsSection = true;
+ break;
+ case '/Subrs':
+ ++i;
+ var num = parseInt(getToken(), 10);
+ getToken(); // read in 'array'
+ for (var j = 0; j < num; ++j) {
+ var t = getToken(); // read in 'dup'
+ if (t == 'ND' || t == '|-' || t == 'noaccess')
+ break;
+ var index = parseInt(getToken(), 10);
+ if (index > j)
+ j = index;
+ var length = parseInt(getToken(), 10);
+ getToken(); // read in 'RD'
+ var data = eexec.slice(i + 1, i + 1 + length);
+ var lenIV = program.properties.private['lenIV'];
+ var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+ var str = decodeCharString(encoded);
+ i = i + 1 + length;
+ t = getToken(); // read in 'NP'
+ if (t == 'noaccess')
+ getToken(); // read in 'put'
+ program.subrs[index] = str.charstring;
+ }
+ break;
+ case '/BlueValues':
+ case '/OtherBlues':
+ case '/FamilyBlues':
+ case '/FamilyOtherBlues':
+ case '/StemSnapH':
+ case '/StemSnapV':
+ program.properties.private[token.substring(1)] =
+ readNumberArray(eexecStr, i + 1);
+ break;
+ case '/StdHW':
+ case '/StdVW':
+ program.properties.private[token.substring(1)] =
+ readNumberArray(eexecStr, i + 2)[0];
+ break;
+ case '/BlueShift':
+ case '/lenIV':
+ case '/BlueFuzz':
+ case '/BlueScale':
+ case '/LanguageGroup':
+ case '/ExpansionFactor':
+ program.properties.private[token.substring(1)] =
+ readNumber(eexecStr, i + 1);
+ break;
+ }
+ } else if (c == '/') {
+ token = glyph = '';
+ while ((c = eexecStr[++i]) != ' ')
+ glyph += c;
+ }
+ }
+ }
+
+ return program;
+ };
+
+ this.extractFontHeader = function t1_extractFontHeader(stream, properties) {
+ var headerString = '';
+ for (var i = 0, ii = stream.length; i < ii; i++)
+ headerString += String.fromCharCode(stream[i]);
+
+ var token = '';
+ var count = headerString.length;
+ for (var i = 0; i < count; i++) {
+ var getToken = function getToken() {
+ var char = headerString[i];
+ while (i < count && (isSeparator(char) || char == '/'))
+ char = headerString[++i];
+
+ var token = '';
+ while (i < count && !(isSeparator(char) || char == '/')) {
+ token += char;
+ char = headerString[++i];
+ }
+
+ return token;
+ };
+
+ var c = headerString[i];
+ if (isSeparator(c)) {
+ switch (token) {
+ case '/FontMatrix':
+ var matrix = readNumberArray(headerString, i + 1);
+
+ // The FontMatrix is in unitPerEm, so make it pixels
+ for (var j = 0, jj = matrix.length; j < jj; j++)
+ matrix[j] *= 1000;
+
+ // Make the angle into the right direction
+ matrix[2] *= -1;
+
+ properties.fontMatrix = matrix;
+ break;
+ case '/Encoding':
+ var encodingArg = getToken();
+ var encoding;
+ if (!/^\d+$/.test(encodingArg)) {
+ // encoding name is specified
+ encoding = Encodings[encodingArg];
+ } else {
+ encoding = [];
+ var size = parseInt(encodingArg, 10);
+ getToken(); // read in 'array'
+
+ for (var j = 0; j < size; j++) {
+ var token = getToken();
+ if (token == 'dup') {
+ var index = parseInt(getToken(), 10);
+ var glyph = getToken();
+ encoding[index] = glyph;
+ getToken(); // read the in 'put'
+ }
+ }
+ }
+ if (!properties.hasEncoding && encoding) {
+ properties.baseEncoding = encoding;
+ break;
+ }
+ break;
+ }
+ token = '';
+ } else {
+ token += c;
+ }
+ }
+ };
+};
+
+/**
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
+ */
+var CFFStrings = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
+ 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+ 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
+ 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
+ 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+ 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
+ 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
+ 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
+ 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
+ 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
+ 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
+ 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
+ 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
+ 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
+ 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
+ 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
+ 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
+ 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
+ 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
+ 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
+ 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
+ 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+ 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
+ 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+ 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+ 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
+ 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
+ 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
+ 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+ 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
+ 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
+ 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
+ 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
+ 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+ 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
+ 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
+ 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
+ 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
+ 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
+ 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
+ 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
+ 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
+ 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
+ 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
+ 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
+ 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
+ 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
+];
+
+var type1Parser = new Type1Parser();
+
+var CFF = function cffCFF(name, file, properties) {
+ // Get the data block containing glyphs and subrs informations
+ var headerBlock = file.getBytes(properties.length1);
+ type1Parser.extractFontHeader(headerBlock, properties);
+
+ // Decrypt the data blocks and retrieve it's content
+ var eexecBlock = file.getBytes(properties.length2);
+ var data = type1Parser.extractFontProgram(eexecBlock);
+ for (var info in data.properties)
+ properties[info] = data.properties[info];
+
+ var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
+ var type2Charstrings = this.getType2Charstrings(charstrings);
+ var subrs = this.getType2Subrs(data.subrs);
+
+ this.charstrings = charstrings;
+ this.data = this.wrap(name, type2Charstrings, this.charstrings,
+ subrs, properties);
+};
+
+CFF.prototype = {
+ createCFFIndexHeader: function cff_createCFFIndexHeader(objects, isByte) {
+ // First 2 bytes contains the number of objects contained into this index
+ var count = objects.length;
+
+ // If there is no object, just create an array saying that with another
+ // offset byte.
+ if (count == 0)
+ return '\x00\x00\x00';
+
+ var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
+
+ // Next byte contains the offset size use to reference object in the file
+ // Actually we're using 0x04 to be sure to be able to store everything
+ // without thinking of it while coding.
+ data += '\x04';
+
+ // Add another offset after this one because we need a new offset
+ var relativeOffset = 1;
+ for (var i = 0; i < count + 1; i++) {
+ data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
+ (relativeOffset >> 16) & 0xFF,
+ (relativeOffset >> 8) & 0xFF,
+ relativeOffset & 0xFF);
+
+ if (objects[i])
+ relativeOffset += objects[i].length;
+ }
+
+ for (var i = 0; i < count; i++) {
+ for (var j = 0, jj = objects[i].length; j < jj; j++)
+ data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
+ objects[i][j];
+ }
+ return data;
+ },
+
+ encodeNumber: function cff_encodeNumber(value) {
+ // some of the fonts has ouf-of-range values
+ // they are just arithmetic overflows
+ // make sanitizer happy
+ value |= 0;
+ if (value >= -32768 && value <= 32767) {
+ return '\x1c' +
+ String.fromCharCode((value >> 8) & 0xFF) +
+ String.fromCharCode(value & 0xFF);
+ } else {
+ return '\x1d' +
+ String.fromCharCode((value >> 24) & 0xFF) +
+ String.fromCharCode((value >> 16) & 0xFF) +
+ String.fromCharCode((value >> 8) & 0xFF) +
+ String.fromCharCode(value & 0xFF);
+ }
+ },
+
+ getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs,
+ properties) {
+ var charstrings = [];
+ var reverseMapping = {};
+ var encoding = properties.baseEncoding;
+ var i, length, glyphName;
+ for (i = 0, length = encoding.length; i < length; ++i) {
+ glyphName = encoding[i];
+ if (!glyphName || isSpecialUnicode(i))
+ continue;
+ reverseMapping[glyphName] = i;
+ }
+ reverseMapping['.notdef'] = 0;
+ var unusedUnicode = kCmapGlyphOffset;
+ for (i = 0, length = glyphs.length; i < length; i++) {
+ var item = glyphs[i];
+ var glyphName = item.glyph;
+ var unicode = glyphName in reverseMapping ?
+ reverseMapping[glyphName] : unusedUnicode++;
+ charstrings.push({
+ glyph: glyphName,
+ unicode: unicode,
+ gid: i,
+ charstring: item.data,
+ width: item.width,
+ lsb: item.lsb
+ });
+ }
+
+ charstrings.sort(function charstrings_sort(a, b) {
+ return a.unicode - b.unicode;
+ });
+ return charstrings;
+ },
+
+ getType2Charstrings: function cff_getType2Charstrings(type1Charstrings) {
+ var type2Charstrings = [];
+ var count = type1Charstrings.length;
+ for (var i = 0; i < count; i++) {
+ var charstring = type1Charstrings[i].charstring;
+ type2Charstrings.push(this.flattenCharstring(charstring.slice(),
+ this.commandsMap));
+ }
+ return type2Charstrings;
+ },
+
+ getType2Subrs: function cff_getType2Subrs(type1Subrs) {
+ var bias = 0;
+ var count = type1Subrs.length;
+ if (count < 1240)
+ bias = 107;
+ else if (count < 33900)
+ bias = 1131;
+ else
+ bias = 32768;
+
+ // Add a bunch of empty subrs to deal with the Type2 bias
+ var type2Subrs = [];
+ for (var i = 0; i < bias; i++)
+ type2Subrs.push([0x0B]);
+
+ for (var i = 0; i < count; i++) {
+ var subr = type1Subrs[i];
+ if (!subr)
+ subr = [0x0B];
+
+ type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
+ }
+
+ return type2Subrs;
+ },
+
+ /*
+ * Flatten the commands by interpreting the postscript code and replacing
+ * every 'callsubr', 'callothersubr' by the real commands.
+ */
+ commandsMap: {
+ 'hstem': 1,
+ 'vstem': 3,
+ 'vmoveto': 4,
+ 'rlineto': 5,
+ 'hlineto': 6,
+ 'vlineto': 7,
+ 'rrcurveto': 8,
+ 'callsubr': 10,
+ 'return': 11,
+ 'sub': [12, 11],
+ 'div': [12, 12],
+ 'exch': [12, 28],
+ 'flex': [12, 35],
+ 'drop' : [12, 18],
+ 'endchar': 14,
+ 'rmoveto': 21,
+ 'hmoveto': 22,
+ 'vhcurveto': 30,
+ 'hvcurveto': 31
+ },
+
+ flattenCharstring: function flattenCharstring(charstring, map) {
+ // charstring changes size - can't cache .length in loop
+ for (var i = 0; i < charstring.length; i++) {
+ var command = charstring[i];
+ if (command.charAt) {
+ var cmd = map[command];
+ assert(cmd, 'Unknow command: ' + command);
+
+ if (isArray(cmd))
+ charstring.splice(i++, 1, cmd[0], cmd[1]);
+ else
+ charstring[i] = cmd;
+ } else {
+ // Type1 charstring use a division for number above 32000
+ if (command > 32000) {
+ var divisor = charstring[i + 1];
+ command /= divisor;
+ charstring.splice(i, 3, 28, command >> 8, command & 0xff);
+ } else {
+ charstring.splice(i, 1, 28, command >> 8, command & 0xff);
+ }
+ i += 2;
+ }
+ }
+ return charstring;
+ },
+
+ wrap: function wrap(name, glyphs, charstrings, subrs, properties) {
+ var fields = {
+ // major version, minor version, header size, offset size
+ 'header': '\x01\x00\x04\x04',
+
+ 'names': this.createCFFIndexHeader([name]),
+
+ 'topDict': (function topDict(self) {
+ return function cffWrapTopDict() {
+ var header = '\x00\x01\x01\x01';
+ var dict =
+ '\xf8\x1b\x00' + // version
+ '\xf8\x1c\x01' + // Notice
+ '\xf8\x1d\x02' + // FullName
+ '\xf8\x1e\x03' + // FamilyName
+ '\xf8\x1f\x04' + // Weight
+ '\x1c\x00\x00\x10'; // Encoding
+
+ var boundingBox = properties.bbox;
+ for (var i = 0, ii = boundingBox.length; i < ii; i++)
+ dict += self.encodeNumber(boundingBox[i]);
+ dict += '\x05'; // FontBBox;
+
+ var offset = fields.header.length +
+ fields.names.length +
+ (header.length + 1) +
+ (dict.length + (4 + 4)) +
+ fields.strings.length +
+ fields.globalSubrs.length;
+
+ // If the offset if over 32767, encodeNumber is going to return
+ // 5 bytes to encode the position instead of 3.
+ if ((offset + fields.charstrings.length) > 32767) {
+ offset += 9;
+ } else {
+ offset += 7;
+ }
+
+ dict += self.encodeNumber(offset) + '\x0f'; // Charset
+
+ offset = offset + (glyphs.length * 2) + 1;
+ dict += self.encodeNumber(offset) + '\x11'; // Charstrings
+
+ offset = offset + fields.charstrings.length;
+ dict += self.encodeNumber(fields.private.length);
+ dict += self.encodeNumber(offset) + '\x12'; // Private
+
+ return header + String.fromCharCode(dict.length + 1) + dict;
+ };
+ })(this),
+
+ 'strings': (function strings(self) {
+ var strings = [
+ 'Version 0.11', // Version
+ 'See original notice', // Notice
+ name, // FullName
+ name, // FamilyName
+ 'Medium' // Weight
+ ];
+ return self.createCFFIndexHeader(strings);
+ })(this),
+
+ 'globalSubrs': this.createCFFIndexHeader([]),
+
+ 'charset': (function charset(self) {
+ var charsetString = '\x00'; // Encoding
+
+ var count = glyphs.length;
+ for (var i = 0; i < count; i++) {
+ var index = CFFStrings.indexOf(charstrings[i].glyph);
+ // Some characters like asterikmath && circlecopyrt are
+ // missing from the original strings, for the moment let's
+ // map them to .notdef and see later if it cause any
+ // problems
+ if (index == -1)
+ index = 0;
+
+ charsetString += String.fromCharCode(index >> 8, index & 0xff);
+ }
+ return charsetString;
+ })(this),
+
+ 'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
+ true),
+
+ 'private': (function cffWrapPrivate(self) {
+ var data =
+ '\x8b\x14' + // defaultWidth
+ '\x8b\x15'; // nominalWidth
+ var fieldMap = {
+ BlueValues: '\x06',
+ OtherBlues: '\x07',
+ FamilyBlues: '\x08',
+ FamilyOtherBlues: '\x09',
+ StemSnapH: '\x0c\x0c',
+ StemSnapV: '\x0c\x0d',
+ BlueShift: '\x0c\x0a',
+ BlueFuzz: '\x0c\x0b',
+ BlueScale: '\x0c\x09',
+ LanguageGroup: '\x0c\x11',
+ ExpansionFactor: '\x0c\x18'
+ };
+ for (var field in fieldMap) {
+ if (!properties.private.hasOwnProperty(field))
+ continue;
+ var value = properties.private[field];
+
+ if (isArray(value)) {
+ data += self.encodeNumber(value[0]);
+ for (var i = 1, ii = value.length; i < ii; i++)
+ data += self.encodeNumber(value[i] - value[i - 1]);
+ } else {
+ data += self.encodeNumber(value);
+ }
+ data += fieldMap[field];
+ }
+
+ data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
+
+ return data;
+ })(this),
+
+ 'localSubrs': this.createCFFIndexHeader(subrs, true)
+ };
+ fields.topDict = fields.topDict();
+
+
+ var cff = [];
+ for (var index in fields) {
+ var field = fields[index];
+ for (var i = 0, ii = field.length; i < ii; i++)
+ cff.push(field.charCodeAt(i));
+ }
+
+ return cff;
+ }
+};
+
+var Type2CFF = (function type2CFF() {
+ // TODO: replace parsing code with the Type2Parser in font_utils.js
+ function constructor(file, properties) {
+ var bytes = file.getBytes();
+ this.bytes = bytes;
+ this.properties = properties;
+
+ this.data = this.parse();
+ }
+
+ constructor.prototype = {
+ parse: function cff_parse() {
+ var header = this.parseHeader();
+ var properties = this.properties;
+ var nameIndex = this.parseIndex(header.endPos);
+
+ var dictIndex = this.parseIndex(nameIndex.endPos);
+ if (dictIndex.length != 1)
+ error('CFF contains more than 1 font');
+
+ var stringIndex = this.parseIndex(dictIndex.endPos);
+ var gsubrIndex = this.parseIndex(stringIndex.endPos);
+
+ var strings = this.getStrings(stringIndex);
+
+ var baseDict = this.parseDict(dictIndex.get(0).data);
+ var topDict = this.getTopDict(baseDict, strings);
+
+ var bytes = this.bytes;
+
+ var privateDict = {};
+ var privateInfo = topDict.Private;
+ if (privateInfo) {
+ var privOffset = privateInfo[1], privLength = privateInfo[0];
+ var privBytes = bytes.subarray(privOffset, privOffset + privLength);
+ baseDict = this.parseDict(privBytes);
+ privateDict = this.getPrivDict(baseDict, strings);
+ } else {
+ privateDict.defaultWidthX = properties.defaultWidth;
+ }
+
+ var charStrings = this.parseIndex(topDict.CharStrings);
+ var charset = this.parseCharsets(topDict.charset,
+ charStrings.length, strings);
+ var encoding = this.parseEncoding(topDict.Encoding, properties,
+ strings, charset);
+
+ var charset, encoding;
+ var isCIDFont = properties.subtype == 'CIDFontType0C';
+ if (isCIDFont) {
+ charset = [];
+ charset.length = charStrings.length;
+ encoding = this.parseCidMap(topDict.charset,
+ charStrings.length);
+ } else {
+ charset = this.parseCharsets(topDict.charset,
+ charStrings.length, strings);
+ encoding = this.parseEncoding(topDict.Encoding, properties,
+ strings, charset);
+ }
+
+ // The font sanitizer does not support CFF encoding with a
+ // supplement, since the encoding is not really use to map
+ // between gid to glyph, let's overwrite what is declared in
+ // the top dictionary to let the sanitizer think the font use
+ // StandardEncoding, that's a lie but that's ok.
+ if (encoding.hasSupplement)
+ bytes[topDict.Encoding] &= 0x7F;
+
+ // The CFF specification state that the 'dotsection' command
+ // (12, 0) is deprecated and treated as a no-op, but all Type2
+ // charstrings processors should support them. Unfortunately
+ // the font sanitizer don't. As a workaround the sequence (12, 0)
+ // is replaced by a useless (0, hmoveto).
+ var count = charStrings.length;
+ for (var i = 0; i < count; i++) {
+ var charstring = charStrings.get(i);
+
+ var start = charstring.start;
+ var data = charstring.data;
+ var length = data.length;
+ for (var j = 0; j <= length; j) {
+ var value = data[j++];
+ if (value == 12 && data[j++] == 0) {
+ bytes[start + j - 2] = 139;
+ bytes[start + j - 1] = 22;
+ } else if (value === 28) {
+ j += 2;
+ } else if (value >= 247 && value <= 254) {
+ j++;
+ } else if (value == 255) {
+ j += 4;
+ }
+ }
+ }
+
+ // charstrings contains info about glyphs (one element per glyph
+ // containing mappings for {unicode, width})
+ var charstrings = this.getCharStrings(charset, encoding.encoding,
+ privateDict, this.properties);
+
+ // create the mapping between charstring and glyph id
+ var glyphIds = [];
+ for (var i = 0, ii = charstrings.length; i < ii; i++)
+ glyphIds.push(charstrings[i].gid);
+
+ this.charstrings = charstrings;
+ this.glyphIds = glyphIds;
+
+ var data = [];
+ for (var i = 0, ii = bytes.length; i < ii; ++i)
+ data.push(bytes[i]);
+ return data;
+ },
+
+ getCharStrings: function cff_charstrings(charsets, encoding,
+ privateDict, properties) {
+ var charstrings = [];
+ var unicodeUsed = [];
+ var unassignedUnicodeItems = [];
+ for (var i = 0, ii = charsets.length; i < ii; i++) {
+ var glyph = charsets[i];
+ var encodingFound = false;
+ for (var charcode in encoding) {
+ if (encoding[charcode] == i) {
+ var code = charcode | 0;
+ charstrings.push({
+ unicode: adaptUnicode(code),
+ code: code,
+ gid: i,
+ glyph: glyph
+ });
+ unicodeUsed[code] = true;
+ encodingFound = true;
+ break;
+ }
+ }
+ if (!encodingFound) {
+ unassignedUnicodeItems.push(i);
+ }
+ }
+
+ var nextUnusedUnicode = 0x21;
+ for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
+ var i = unassignedUnicodeItems[j];
+ // giving unicode value anyway
+ while (unicodeUsed[nextUnusedUnicode])
+ nextUnusedUnicode++;
+ var code = nextUnusedUnicode++;
+ charstrings.push({
+ unicode: adaptUnicode(code),
+ code: code,
+ gid: i,
+ glyph: charsets[i]
+ });
+ }
+
+ // sort the array by the unicode value (again)
+ charstrings.sort(function type2CFFGetCharStringsSort(a, b) {
+ return a.unicode - b.unicode;
+ });
+ return charstrings;
+ },
+
+ parseEncoding: function cff_parseencoding(pos, properties, strings,
+ charset) {
+ var encoding = {};
+ var bytes = this.bytes;
+ var result = {
+ encoding: encoding,
+ hasSupplement: false
+ };
+
+ function readSupplement() {
+ var supplementsCount = bytes[pos++];
+ for (var i = 0; i < supplementsCount; i++) {
+ var code = bytes[pos++];
+ var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+ encoding[code] = properties.differences.indexOf(strings[sid]);
+ }
+ }
+
+ if (pos == 0 || pos == 1) {
+ var gid = 1;
+ var baseEncoding = pos ? Encodings.ExpertEncoding :
+ Encodings.StandardEncoding;
+ for (var i = 0, ii = charset.length; i < ii; i++) {
+ var index = baseEncoding.indexOf(charset[i]);
+ if (index != -1)
+ encoding[index] = gid++;
+ }
+ } else {
+ var format = bytes[pos++];
+ switch (format & 0x7f) {
+ case 0:
+ var glyphsCount = bytes[pos++];
+ for (var i = 1; i <= glyphsCount; i++)
+ encoding[bytes[pos++]] = i;
+ break;
+
+ case 1:
+ var rangesCount = bytes[pos++];
+ var gid = 1;
+ for (var i = 0; i < rangesCount; i++) {
+ var start = bytes[pos++];
+ var left = bytes[pos++];
+ for (var j = start; j <= start + left; j++)
+ encoding[j] = gid++;
+ }
+ break;
+
+ default:
+ error('Unknow encoding format: ' + format + ' in CFF');
+ break;
+ }
+ if (format & 0x80) {
+ readSupplement();
+ result.hasSupplement = true;
+ }
+ }
+ return result;
+ },
+
+ parseCharsets: function cff_parsecharsets(pos, length, strings) {
+ if (pos == 0) {
+ return ISOAdobeCharset.slice();
+ } else if (pos == 1) {
+ return ExpertCharset.slice();
+ } else if (pos == 2) {
+ return ExpertSubsetCharset.slice();
+ }
+
+ var bytes = this.bytes;
+ var format = bytes[pos++];
+ var charset = ['.notdef'];
+
+ // subtract 1 for the .notdef glyph
+ length -= 1;
+
+ switch (format) {
+ case 0:
+ for (var i = 0; i < length; i++) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ charset.push(strings[sid]);
+ }
+ break;
+ case 1:
+ while (charset.length <= length) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ charset.push(strings[sid++]);
+ }
+ break;
+ case 2:
+ while (charset.length <= length) {
+ var sid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = (bytes[pos++] << 8) | bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ charset.push(strings[sid++]);
+ }
+ break;
+ default:
+ error('Unknown charset format');
+ }
+ return charset;
+ },
+
+ parseCidMap: function cff_parsecharsets(pos, length) {
+ var bytes = this.bytes;
+ var format = bytes[pos++];
+
+ var encoding = {};
+ var map = {encoding: encoding};
+
+ encoding[0] = 0;
+
+ var gid = 1;
+ switch (format) {
+ case 0:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ encoding[cid] = gid++;
+ }
+ break;
+ case 1:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ encoding[cid++] = gid++;
+ }
+ break;
+ case 2:
+ while (gid < length) {
+ var cid = (bytes[pos++] << 8) | bytes[pos++];
+ var count = (bytes[pos++] << 8) | bytes[pos++];
+ for (var i = 0; i <= count; i++)
+ encoding[cid++] = gid++;
+ }
+ break;
+ default:
+ error('Unknown charset format');
+ }
+ return map;
+ },
+
+ getPrivDict: function cff_getprivdict(baseDict, strings) {
+ var dict = {};
+
+ // default values
+ dict['defaultWidthX'] = 0;
+ dict['nominalWidthX'] = 0;
+
+ for (var i = 0, ii = baseDict.length; i < ii; ++i) {
+ var pair = baseDict[i];
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 20:
+ dict['defaultWidthX'] = value[0];
+ case 21:
+ dict['nominalWidthX'] = value[0];
+ default:
+ TODO('interpret top dict key: ' + key);
+ }
+ }
+ return dict;
+ },
+ getTopDict: function cff_gettopdict(baseDict, strings) {
+ var dict = {};
+
+ // default values
+ dict['Encoding'] = 0;
+ dict['charset'] = 0;
+
+ for (var i = 0, ii = baseDict.length; i < ii; ++i) {
+ var pair = baseDict[i];
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 1:
+ dict['Notice'] = strings[value[0]];
+ break;
+ case 4:
+ dict['Weight'] = strings[value[0]];
+ break;
+ case 3094:
+ dict['BaseFontName'] = strings[value[0]];
+ break;
+ case 5:
+ dict['FontBBox'] = value;
+ break;
+ case 13:
+ dict['UniqueID'] = value[0];
+ break;
+ case 15:
+ dict['charset'] = value[0];
+ break;
+ case 16:
+ dict['Encoding'] = value[0];
+ break;
+ case 17:
+ dict['CharStrings'] = value[0];
+ break;
+ case 18:
+ dict['Private'] = value;
+ break;
+ case 3102:
+ case 3103:
+ case 3104:
+ case 3105:
+ case 3106:
+ case 3107:
+ case 3108:
+ case 3109:
+ case 3110:
+ dict['cidOperatorPresent'] = true;
+ break;
+ default:
+ TODO('interpret top dict key');
+ }
+ }
+ return dict;
+ },
+ getStrings: function cff_getStrings(stringIndex) {
+ function bytesToString(bytesArray) {
+ var str = '';
+ for (var i = 0, ii = bytesArray.length; i < ii; i++)
+ str += String.fromCharCode(bytesArray[i]);
+ return str;
+ }
+
+ var stringArray = [];
+ for (var i = 0, ii = CFFStrings.length; i < ii; i++)
+ stringArray.push(CFFStrings[i]);
+
+ for (var i = 0, ii = stringIndex.length; i < ii; i++)
+ stringArray.push(bytesToString(stringIndex.get(i).data));
+
+ return stringArray;
+ },
+ parseHeader: function cff_parseHeader() {
+ var bytes = this.bytes;
+ var offset = 0;
+
+ while (bytes[offset] != 1)
+ ++offset;
+
+ if (offset != 0) {
+ warning('cff data is shifted');
+ bytes = bytes.subarray(offset);
+ this.bytes = bytes;
+ }
+
+ return {
+ endPos: bytes[2],
+ offsetSize: bytes[3]
+ };
+ },
+ parseDict: function cff_parseDict(dict) {
+ var pos = 0;
+
+ function parseOperand() {
+ var value = dict[pos++];
+ if (value === 30) {
+ return parseFloatOperand(pos);
+ } else if (value === 28) {
+ value = dict[pos++];
+ value = (value << 8) | dict[pos++];
+ return value;
+ } else if (value === 29) {
+ value = dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ return value;
+ } else if (value <= 246) {
+ return value - 139;
+ } else if (value <= 250) {
+ return ((value - 247) * 256) + dict[pos++] + 108;
+ } else if (value <= 254) {
+ return -((value - 251) * 256) - dict[pos++] - 108;
+ } else {
+ error('255 is not a valid DICT command');
+ }
+ return -1;
+ }
+
+ function parseFloatOperand() {
+ var str = '';
+ var eof = 15;
+ var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', '.', 'E', 'E-', null, '-'];
+ var length = dict.length;
+ while (pos < length) {
+ var b = dict[pos++];
+ var b1 = b >> 4;
+ var b2 = b & 15;
+
+ if (b1 == eof)
+ break;
+ str += lookup[b1];
+
+ if (b2 == eof)
+ break;
+ str += lookup[b2];
+ }
+ return parseFloat(str);
+ }
+
+ var operands = [];
+ var entries = [];
+
+ var pos = 0;
+ var end = dict.length;
+ while (pos < end) {
+ var b = dict[pos];
+ if (b <= 21) {
+ if (b === 12) {
+ ++pos;
+ var op = dict[pos];
+ if ((op > 14 && op < 17) ||
+ (op > 23 && op < 30) || op > 38) {
+ warn('Invalid CFF dictionary key: ' + op);
+ // trying to replace it with initialRandomSeed
+ // to pass sanitizer
+ dict[pos] = 19;
+ }
+ var b = (b << 8) | op;
+ }
+ if (!operands.length && b == 8 &&
+ dict[pos + 1] == 9) {
+ // no operands for FamilyBlues, removing the key
+ // and next one is FamilyOtherBlues - skipping them
+ // also replacing FamilyBlues to pass sanitizer
+ dict[pos] = 139;
+ pos += 2;
+ continue;
+ }
+ entries.push([b, operands]);
+ operands = [];
+ ++pos;
+ } else {
+ operands.push(parseOperand());
+ }
+ }
+ return entries;
+ },
+ parseIndex: function cff_parseIndex(pos) {
+ var bytes = this.bytes;
+ var count = bytes[pos++] << 8 | bytes[pos++];
+ var offsets = [];
+ var end = pos;
+
+ if (count != 0) {
+ var offsetSize = bytes[pos++];
+ // add 1 for offset to determine size of last object
+ var startPos = pos + ((count + 1) * offsetSize) - 1;
+
+ for (var i = 0, ii = count + 1; i < ii; ++i) {
+ var offset = 0;
+ for (var j = 0; j < offsetSize; ++j) {
+ offset <<= 8;
+ offset += bytes[pos++];
+ }
+ offsets.push(startPos + offset);
+ }
+ end = offsets[count];
+ }
+
+ return {
+ get: function index_get(index) {
+ if (index >= count)
+ return null;
+
+ var start = offsets[index];
+ var end = offsets[index + 1];
+ return {
+ start: start,
+ end: end,
+ data: bytes.subarray(start, end)
+ };
+ },
+ length: count,
+ endPos: end
+ };
+ }
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/function.js b/apps/files_pdfviewer/js/pdfjs/src/function.js
new file mode 100755
index 00000000000..ef24736c135
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/function.js
@@ -0,0 +1,351 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFFunction = (function pdfFunction() {
+ var CONSTRUCT_SAMPLED = 0;
+ var CONSTRUCT_INTERPOLATED = 2;
+ var CONSTRUCT_STICHED = 3;
+ var CONSTRUCT_POSTSCRIPT = 4;
+
+ return {
+ getSampleArray: function pdfFunctionGetSampleArray(size, outputSize, bps,
+ str) {
+ var length = 1;
+ for (var i = 0, ii = size.length; i < ii; i++)
+ length *= size[i];
+ length *= outputSize;
+
+ var array = [];
+ var codeSize = 0;
+ var codeBuf = 0;
+ // 32 is a valid bps so shifting won't work
+ var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+ var strBytes = str.getBytes((length * bps + 7) / 8);
+ var strIdx = 0;
+ for (var i = 0; i < length; i++) {
+ while (codeSize < bps) {
+ codeBuf <<= 8;
+ codeBuf |= strBytes[strIdx++];
+ codeSize += 8;
+ }
+ codeSize -= bps;
+ array.push((codeBuf >> codeSize) * sampleMul);
+ codeBuf &= (1 << codeSize) - 1;
+ }
+ return array;
+ },
+
+ getIR: function pdfFunctionGetIR(xref, fn) {
+ var dict = fn.dict;
+ if (!dict)
+ dict = fn;
+
+ var types = [this.constructSampled,
+ null,
+ this.constructInterpolated,
+ this.constructStiched,
+ this.constructPostScript];
+
+ var typeNum = dict.get('FunctionType');
+ var typeFn = types[typeNum];
+ if (!typeFn)
+ error('Unknown type of function');
+
+ return typeFn.call(this, fn, dict, xref);
+ },
+
+ fromIR: function pdfFunctionFromIR(IR) {
+ var type = IR[0];
+ switch (type) {
+ case CONSTRUCT_SAMPLED:
+ return this.constructSampledFromIR(IR);
+ case CONSTRUCT_INTERPOLATED:
+ return this.constructInterpolatedFromIR(IR);
+ case CONSTRUCT_STICHED:
+ return this.constructStichedFromIR(IR);
+ case CONSTRUCT_POSTSCRIPT:
+ default:
+ return this.constructPostScriptFromIR(IR);
+ }
+ },
+
+ parse: function pdfFunctionParse(xref, fn) {
+ var IR = this.getIR(xref, fn);
+ return this.fromIR(IR);
+ },
+
+ constructSampled: function pdfFunctionConstructSampled(str, dict) {
+ function toMultiArray(arr) {
+ var inputLength = arr.length;
+ var outputLength = arr.length / 2;
+ var out = new Array(outputLength);
+ var index = 0;
+ for (var i = 0; i < inputLength; i += 2) {
+ out[index] = [arr[i], arr[i + 1]];
+ ++index;
+ }
+ return out;
+ }
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain || !range)
+ error('No domain or range');
+
+ var inputSize = domain.length / 2;
+ var outputSize = range.length / 2;
+
+ domain = toMultiArray(domain);
+ range = toMultiArray(range);
+
+ var size = dict.get('Size');
+ var bps = dict.get('BitsPerSample');
+ var order = dict.get('Order');
+ if (!order)
+ order = 1;
+ if (order !== 1)
+ error('No support for cubic spline interpolation: ' + order);
+
+ var encode = dict.get('Encode');
+ if (!encode) {
+ encode = [];
+ for (var i = 0; i < inputSize; ++i) {
+ encode.push(0);
+ encode.push(size[i] - 1);
+ }
+ }
+ encode = toMultiArray(encode);
+
+ var decode = dict.get('Decode');
+ if (!decode)
+ decode = range;
+ else
+ decode = toMultiArray(decode);
+
+ // Precalc the multipliers
+ var inputMul = new Float64Array(inputSize);
+ for (var i = 0; i < inputSize; ++i) {
+ inputMul[i] = (encode[i][1] - encode[i][0]) /
+ (domain[i][1] - domain[i][0]);
+ }
+
+ var idxMul = new Int32Array(inputSize);
+ idxMul[0] = outputSize;
+ for (i = 1; i < inputSize; ++i) {
+ idxMul[i] = idxMul[i - 1] * size[i - 1];
+ }
+
+ var nSamples = outputSize;
+ for (i = 0; i < inputSize; ++i)
+ nSamples *= size[i];
+
+ var samples = this.getSampleArray(size, outputSize, bps, str);
+
+ return [
+ CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+ outputSize, bps, range, inputMul, idxMul, nSamples
+ ];
+ },
+
+ constructSampledFromIR: function pdfFunctionConstructSampledFromIR(IR) {
+ var inputSize = IR[1];
+ var domain = IR[2];
+ var encode = IR[3];
+ var decode = IR[4];
+ var samples = IR[5];
+ var size = IR[6];
+ var outputSize = IR[7];
+ var bps = IR[8];
+ var range = IR[9];
+ var inputMul = IR[10];
+ var idxMul = IR[11];
+ var nSamples = IR[12];
+
+ return function constructSampledFromIRResult(args) {
+ if (inputSize != args.length)
+ error('Incorrect number of arguments: ' + inputSize + ' != ' +
+ args.length);
+ // Most of the below is a port of Poppler's implementation.
+ // TODO: There's a few other ways to do multilinear interpolation such
+ // as piecewise, which is much faster but an approximation.
+ var out = new Float64Array(outputSize);
+ var x;
+ var e = new Array(inputSize);
+ var efrac0 = new Float64Array(inputSize);
+ var efrac1 = new Float64Array(inputSize);
+ var sBuf = new Float64Array(1 << inputSize);
+ var i, j, k, idx, t;
+
+ // map input values into sample array
+ for (i = 0; i < inputSize; ++i) {
+ x = (args[i] - domain[i][0]) * inputMul[i] + encode[i][0];
+ if (x < 0) {
+ x = 0;
+ } else if (x > size[i] - 1) {
+ x = size[i] - 1;
+ }
+ e[i] = [Math.floor(x), 0];
+ if ((e[i][1] = e[i][0] + 1) >= size[i]) {
+ // this happens if in[i] = domain[i][1]
+ e[i][1] = e[i][0];
+ }
+ efrac1[i] = x - e[i][0];
+ efrac0[i] = 1 - efrac1[i];
+ }
+
+ // for each output, do m-linear interpolation
+ for (i = 0; i < outputSize; ++i) {
+
+ // pull 2^m values out of the sample array
+ for (j = 0; j < (1 << inputSize); ++j) {
+ idx = i;
+ for (k = 0, t = j; k < inputSize; ++k, t >>= 1) {
+ idx += idxMul[k] * (e[k][t & 1]);
+ }
+ if (idx >= 0 && idx < nSamples) {
+ sBuf[j] = samples[idx];
+ } else {
+ sBuf[j] = 0; // TODO Investigate if this is what Adobe does
+ }
+ }
+
+ // do m sets of interpolations
+ for (j = 0, t = (1 << inputSize); j < inputSize; ++j, t >>= 1) {
+ for (k = 0; k < t; k += 2) {
+ sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k + 1];
+ }
+ }
+
+ // map output value to range
+ out[i] = (sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0]);
+ if (out[i] < range[i][0]) {
+ out[i] = range[i][0];
+ } else if (out[i] > range[i][1]) {
+ out[i] = range[i][1];
+ }
+ }
+ return out;
+ }
+ },
+
+ constructInterpolated:
+ function pdfFunctionConstructInterpolated(str, dict) {
+ var c0 = dict.get('C0') || [0];
+ var c1 = dict.get('C1') || [1];
+ var n = dict.get('N');
+
+ if (!isArray(c0) || !isArray(c1))
+ error('Illegal dictionary for interpolated function');
+
+ var length = c0.length;
+ var diff = [];
+ for (var i = 0; i < length; ++i)
+ diff.push(c1[i] - c0[i]);
+
+ return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+ },
+
+ constructInterpolatedFromIR:
+ function pdfFunctionconstructInterpolatedFromIR(IR) {
+ var c0 = IR[1];
+ var diff = IR[2];
+ var n = IR[3];
+
+ var length = diff.length;
+
+ return function constructInterpolatedFromIRResult(args) {
+ var x = n == 1 ? args[0] : Math.pow(args[0], n);
+
+ var out = [];
+ for (var j = 0; j < length; ++j)
+ out.push(c0[j] + (x * diff[j]));
+
+ return out;
+
+ }
+ },
+
+ constructStiched: function pdfFunctionConstructStiched(fn, dict, xref) {
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain)
+ error('No domain');
+
+ var inputSize = domain.length / 2;
+ if (inputSize != 1)
+ error('Bad domain for stiched function');
+
+ var fnRefs = dict.get('Functions');
+ var fns = [];
+ for (var i = 0, ii = fnRefs.length; i < ii; ++i)
+ fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+
+ var bounds = dict.get('Bounds');
+ var encode = dict.get('Encode');
+
+ return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+ },
+
+ constructStichedFromIR: function pdfFunctionConstructStichedFromIR(IR) {
+ var domain = IR[1];
+ var bounds = IR[2];
+ var encode = IR[3];
+ var fnsIR = IR[4];
+ var fns = [];
+
+ for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+ fns.push(PDFFunction.fromIR(fnsIR[i]));
+ }
+
+ return function constructStichedFromIRResult(args) {
+ var clip = function constructStichedFromIRClip(v, min, max) {
+ if (v > max)
+ v = max;
+ else if (v < min)
+ v = min;
+ return v;
+ };
+
+ // clip to domain
+ var v = clip(args[0], domain[0], domain[1]);
+ // calulate which bound the value is in
+ for (var i = 0, ii = bounds.length; i < ii; ++i) {
+ if (v < bounds[i])
+ break;
+ }
+
+ // encode value into domain of function
+ var dmin = domain[0];
+ if (i > 0)
+ dmin = bounds[i - 1];
+ var dmax = domain[1];
+ if (i < bounds.length)
+ dmax = bounds[i];
+
+ var rmin = encode[2 * i];
+ var rmax = encode[2 * i + 1];
+
+ var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+ // call the appropropriate function
+ return fns[i]([v2]);
+ };
+ },
+
+ constructPostScript: function pdfFunctionConstructPostScript() {
+ return [CONSTRUCT_POSTSCRIPT];
+ },
+
+ constructPostScriptFromIR: function pdfFunctionConstructPostScriptFromIR() {
+ TODO('unhandled type of function');
+ return function constructPostScriptFromIRResult() {
+ return [255, 105, 180];
+ };
+ }
+ };
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js b/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js
new file mode 100755
index 00000000000..5691f85461e
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js
@@ -0,0 +1,4292 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var GlyphsUnicode = {
+ A: 0x0041,
+ AE: 0x00C6,
+ AEacute: 0x01FC,
+ AEmacron: 0x01E2,
+ AEsmall: 0xF7E6,
+ Aacute: 0x00C1,
+ Aacutesmall: 0xF7E1,
+ Abreve: 0x0102,
+ Abreveacute: 0x1EAE,
+ Abrevecyrillic: 0x04D0,
+ Abrevedotbelow: 0x1EB6,
+ Abrevegrave: 0x1EB0,
+ Abrevehookabove: 0x1EB2,
+ Abrevetilde: 0x1EB4,
+ Acaron: 0x01CD,
+ Acircle: 0x24B6,
+ Acircumflex: 0x00C2,
+ Acircumflexacute: 0x1EA4,
+ Acircumflexdotbelow: 0x1EAC,
+ Acircumflexgrave: 0x1EA6,
+ Acircumflexhookabove: 0x1EA8,
+ Acircumflexsmall: 0xF7E2,
+ Acircumflextilde: 0x1EAA,
+ Acute: 0xF6C9,
+ Acutesmall: 0xF7B4,
+ Acyrillic: 0x0410,
+ Adblgrave: 0x0200,
+ Adieresis: 0x00C4,
+ Adieresiscyrillic: 0x04D2,
+ Adieresismacron: 0x01DE,
+ Adieresissmall: 0xF7E4,
+ Adotbelow: 0x1EA0,
+ Adotmacron: 0x01E0,
+ Agrave: 0x00C0,
+ Agravesmall: 0xF7E0,
+ Ahookabove: 0x1EA2,
+ Aiecyrillic: 0x04D4,
+ Ainvertedbreve: 0x0202,
+ Alpha: 0x0391,
+ Alphatonos: 0x0386,
+ Amacron: 0x0100,
+ Amonospace: 0xFF21,
+ Aogonek: 0x0104,
+ Aring: 0x00C5,
+ Aringacute: 0x01FA,
+ Aringbelow: 0x1E00,
+ Aringsmall: 0xF7E5,
+ Asmall: 0xF761,
+ Atilde: 0x00C3,
+ Atildesmall: 0xF7E3,
+ Aybarmenian: 0x0531,
+ B: 0x0042,
+ Bcircle: 0x24B7,
+ Bdotaccent: 0x1E02,
+ Bdotbelow: 0x1E04,
+ Becyrillic: 0x0411,
+ Benarmenian: 0x0532,
+ Beta: 0x0392,
+ Bhook: 0x0181,
+ Blinebelow: 0x1E06,
+ Bmonospace: 0xFF22,
+ Brevesmall: 0xF6F4,
+ Bsmall: 0xF762,
+ Btopbar: 0x0182,
+ C: 0x0043,
+ Caarmenian: 0x053E,
+ Cacute: 0x0106,
+ Caron: 0xF6CA,
+ Caronsmall: 0xF6F5,
+ Ccaron: 0x010C,
+ Ccedilla: 0x00C7,
+ Ccedillaacute: 0x1E08,
+ Ccedillasmall: 0xF7E7,
+ Ccircle: 0x24B8,
+ Ccircumflex: 0x0108,
+ Cdot: 0x010A,
+ Cdotaccent: 0x010A,
+ Cedillasmall: 0xF7B8,
+ Chaarmenian: 0x0549,
+ Cheabkhasiancyrillic: 0x04BC,
+ Checyrillic: 0x0427,
+ Chedescenderabkhasiancyrillic: 0x04BE,
+ Chedescendercyrillic: 0x04B6,
+ Chedieresiscyrillic: 0x04F4,
+ Cheharmenian: 0x0543,
+ Chekhakassiancyrillic: 0x04CB,
+ Cheverticalstrokecyrillic: 0x04B8,
+ Chi: 0x03A7,
+ Chook: 0x0187,
+ Circumflexsmall: 0xF6F6,
+ Cmonospace: 0xFF23,
+ Coarmenian: 0x0551,
+ Csmall: 0xF763,
+ D: 0x0044,
+ DZ: 0x01F1,
+ DZcaron: 0x01C4,
+ Daarmenian: 0x0534,
+ Dafrican: 0x0189,
+ Dcaron: 0x010E,
+ Dcedilla: 0x1E10,
+ Dcircle: 0x24B9,
+ Dcircumflexbelow: 0x1E12,
+ Dcroat: 0x0110,
+ Ddotaccent: 0x1E0A,
+ Ddotbelow: 0x1E0C,
+ Decyrillic: 0x0414,
+ Deicoptic: 0x03EE,
+ Delta: 0x2206,
+ Deltagreek: 0x0394,
+ Dhook: 0x018A,
+ Dieresis: 0xF6CB,
+ DieresisAcute: 0xF6CC,
+ DieresisGrave: 0xF6CD,
+ Dieresissmall: 0xF7A8,
+ Digammagreek: 0x03DC,
+ Djecyrillic: 0x0402,
+ Dlinebelow: 0x1E0E,
+ Dmonospace: 0xFF24,
+ Dotaccentsmall: 0xF6F7,
+ Dslash: 0x0110,
+ Dsmall: 0xF764,
+ Dtopbar: 0x018B,
+ Dz: 0x01F2,
+ Dzcaron: 0x01C5,
+ Dzeabkhasiancyrillic: 0x04E0,
+ Dzecyrillic: 0x0405,
+ Dzhecyrillic: 0x040F,
+ E: 0x0045,
+ Eacute: 0x00C9,
+ Eacutesmall: 0xF7E9,
+ Ebreve: 0x0114,
+ Ecaron: 0x011A,
+ Ecedillabreve: 0x1E1C,
+ Echarmenian: 0x0535,
+ Ecircle: 0x24BA,
+ Ecircumflex: 0x00CA,
+ Ecircumflexacute: 0x1EBE,
+ Ecircumflexbelow: 0x1E18,
+ Ecircumflexdotbelow: 0x1EC6,
+ Ecircumflexgrave: 0x1EC0,
+ Ecircumflexhookabove: 0x1EC2,
+ Ecircumflexsmall: 0xF7EA,
+ Ecircumflextilde: 0x1EC4,
+ Ecyrillic: 0x0404,
+ Edblgrave: 0x0204,
+ Edieresis: 0x00CB,
+ Edieresissmall: 0xF7EB,
+ Edot: 0x0116,
+ Edotaccent: 0x0116,
+ Edotbelow: 0x1EB8,
+ Efcyrillic: 0x0424,
+ Egrave: 0x00C8,
+ Egravesmall: 0xF7E8,
+ Eharmenian: 0x0537,
+ Ehookabove: 0x1EBA,
+ Eightroman: 0x2167,
+ Einvertedbreve: 0x0206,
+ Eiotifiedcyrillic: 0x0464,
+ Elcyrillic: 0x041B,
+ Elevenroman: 0x216A,
+ Emacron: 0x0112,
+ Emacronacute: 0x1E16,
+ Emacrongrave: 0x1E14,
+ Emcyrillic: 0x041C,
+ Emonospace: 0xFF25,
+ Encyrillic: 0x041D,
+ Endescendercyrillic: 0x04A2,
+ Eng: 0x014A,
+ Enghecyrillic: 0x04A4,
+ Enhookcyrillic: 0x04C7,
+ Eogonek: 0x0118,
+ Eopen: 0x0190,
+ Epsilon: 0x0395,
+ Epsilontonos: 0x0388,
+ Ercyrillic: 0x0420,
+ Ereversed: 0x018E,
+ Ereversedcyrillic: 0x042D,
+ Escyrillic: 0x0421,
+ Esdescendercyrillic: 0x04AA,
+ Esh: 0x01A9,
+ Esmall: 0xF765,
+ Eta: 0x0397,
+ Etarmenian: 0x0538,
+ Etatonos: 0x0389,
+ Eth: 0x00D0,
+ Ethsmall: 0xF7F0,
+ Etilde: 0x1EBC,
+ Etildebelow: 0x1E1A,
+ Euro: 0x20AC,
+ Ezh: 0x01B7,
+ Ezhcaron: 0x01EE,
+ Ezhreversed: 0x01B8,
+ F: 0x0046,
+ Fcircle: 0x24BB,
+ Fdotaccent: 0x1E1E,
+ Feharmenian: 0x0556,
+ Feicoptic: 0x03E4,
+ Fhook: 0x0191,
+ Fitacyrillic: 0x0472,
+ Fiveroman: 0x2164,
+ Fmonospace: 0xFF26,
+ Fourroman: 0x2163,
+ Fsmall: 0xF766,
+ G: 0x0047,
+ GBsquare: 0x3387,
+ Gacute: 0x01F4,
+ Gamma: 0x0393,
+ Gammaafrican: 0x0194,
+ Gangiacoptic: 0x03EA,
+ Gbreve: 0x011E,
+ Gcaron: 0x01E6,
+ Gcedilla: 0x0122,
+ Gcircle: 0x24BC,
+ Gcircumflex: 0x011C,
+ Gcommaaccent: 0x0122,
+ Gdot: 0x0120,
+ Gdotaccent: 0x0120,
+ Gecyrillic: 0x0413,
+ Ghadarmenian: 0x0542,
+ Ghemiddlehookcyrillic: 0x0494,
+ Ghestrokecyrillic: 0x0492,
+ Gheupturncyrillic: 0x0490,
+ Ghook: 0x0193,
+ Gimarmenian: 0x0533,
+ Gjecyrillic: 0x0403,
+ Gmacron: 0x1E20,
+ Gmonospace: 0xFF27,
+ Grave: 0xF6CE,
+ Gravesmall: 0xF760,
+ Gsmall: 0xF767,
+ Gsmallhook: 0x029B,
+ Gstroke: 0x01E4,
+ H: 0x0048,
+ H18533: 0x25CF,
+ H18543: 0x25AA,
+ H18551: 0x25AB,
+ H22073: 0x25A1,
+ HPsquare: 0x33CB,
+ Haabkhasiancyrillic: 0x04A8,
+ Hadescendercyrillic: 0x04B2,
+ Hardsigncyrillic: 0x042A,
+ Hbar: 0x0126,
+ Hbrevebelow: 0x1E2A,
+ Hcedilla: 0x1E28,
+ Hcircle: 0x24BD,
+ Hcircumflex: 0x0124,
+ Hdieresis: 0x1E26,
+ Hdotaccent: 0x1E22,
+ Hdotbelow: 0x1E24,
+ Hmonospace: 0xFF28,
+ Hoarmenian: 0x0540,
+ Horicoptic: 0x03E8,
+ Hsmall: 0xF768,
+ Hungarumlaut: 0xF6CF,
+ Hungarumlautsmall: 0xF6F8,
+ Hzsquare: 0x3390,
+ I: 0x0049,
+ IAcyrillic: 0x042F,
+ IJ: 0x0132,
+ IUcyrillic: 0x042E,
+ Iacute: 0x00CD,
+ Iacutesmall: 0xF7ED,
+ Ibreve: 0x012C,
+ Icaron: 0x01CF,
+ Icircle: 0x24BE,
+ Icircumflex: 0x00CE,
+ Icircumflexsmall: 0xF7EE,
+ Icyrillic: 0x0406,
+ Idblgrave: 0x0208,
+ Idieresis: 0x00CF,
+ Idieresisacute: 0x1E2E,
+ Idieresiscyrillic: 0x04E4,
+ Idieresissmall: 0xF7EF,
+ Idot: 0x0130,
+ Idotaccent: 0x0130,
+ Idotbelow: 0x1ECA,
+ Iebrevecyrillic: 0x04D6,
+ Iecyrillic: 0x0415,
+ Ifraktur: 0x2111,
+ Igrave: 0x00CC,
+ Igravesmall: 0xF7EC,
+ Ihookabove: 0x1EC8,
+ Iicyrillic: 0x0418,
+ Iinvertedbreve: 0x020A,
+ Iishortcyrillic: 0x0419,
+ Imacron: 0x012A,
+ Imacroncyrillic: 0x04E2,
+ Imonospace: 0xFF29,
+ Iniarmenian: 0x053B,
+ Iocyrillic: 0x0401,
+ Iogonek: 0x012E,
+ Iota: 0x0399,
+ Iotaafrican: 0x0196,
+ Iotadieresis: 0x03AA,
+ Iotatonos: 0x038A,
+ Ismall: 0xF769,
+ Istroke: 0x0197,
+ Itilde: 0x0128,
+ Itildebelow: 0x1E2C,
+ Izhitsacyrillic: 0x0474,
+ Izhitsadblgravecyrillic: 0x0476,
+ J: 0x004A,
+ Jaarmenian: 0x0541,
+ Jcircle: 0x24BF,
+ Jcircumflex: 0x0134,
+ Jecyrillic: 0x0408,
+ Jheharmenian: 0x054B,
+ Jmonospace: 0xFF2A,
+ Jsmall: 0xF76A,
+ K: 0x004B,
+ KBsquare: 0x3385,
+ KKsquare: 0x33CD,
+ Kabashkircyrillic: 0x04A0,
+ Kacute: 0x1E30,
+ Kacyrillic: 0x041A,
+ Kadescendercyrillic: 0x049A,
+ Kahookcyrillic: 0x04C3,
+ Kappa: 0x039A,
+ Kastrokecyrillic: 0x049E,
+ Kaverticalstrokecyrillic: 0x049C,
+ Kcaron: 0x01E8,
+ Kcedilla: 0x0136,
+ Kcircle: 0x24C0,
+ Kcommaaccent: 0x0136,
+ Kdotbelow: 0x1E32,
+ Keharmenian: 0x0554,
+ Kenarmenian: 0x053F,
+ Khacyrillic: 0x0425,
+ Kheicoptic: 0x03E6,
+ Khook: 0x0198,
+ Kjecyrillic: 0x040C,
+ Klinebelow: 0x1E34,
+ Kmonospace: 0xFF2B,
+ Koppacyrillic: 0x0480,
+ Koppagreek: 0x03DE,
+ Ksicyrillic: 0x046E,
+ Ksmall: 0xF76B,
+ L: 0x004C,
+ LJ: 0x01C7,
+ LL: 0xF6BF,
+ Lacute: 0x0139,
+ Lambda: 0x039B,
+ Lcaron: 0x013D,
+ Lcedilla: 0x013B,
+ Lcircle: 0x24C1,
+ Lcircumflexbelow: 0x1E3C,
+ Lcommaaccent: 0x013B,
+ Ldot: 0x013F,
+ Ldotaccent: 0x013F,
+ Ldotbelow: 0x1E36,
+ Ldotbelowmacron: 0x1E38,
+ Liwnarmenian: 0x053C,
+ Lj: 0x01C8,
+ Ljecyrillic: 0x0409,
+ Llinebelow: 0x1E3A,
+ Lmonospace: 0xFF2C,
+ Lslash: 0x0141,
+ Lslashsmall: 0xF6F9,
+ Lsmall: 0xF76C,
+ M: 0x004D,
+ MBsquare: 0x3386,
+ Macron: 0xF6D0,
+ Macronsmall: 0xF7AF,
+ Macute: 0x1E3E,
+ Mcircle: 0x24C2,
+ Mdotaccent: 0x1E40,
+ Mdotbelow: 0x1E42,
+ Menarmenian: 0x0544,
+ Mmonospace: 0xFF2D,
+ Msmall: 0xF76D,
+ Mturned: 0x019C,
+ Mu: 0x039C,
+ N: 0x004E,
+ NJ: 0x01CA,
+ Nacute: 0x0143,
+ Ncaron: 0x0147,
+ Ncedilla: 0x0145,
+ Ncircle: 0x24C3,
+ Ncircumflexbelow: 0x1E4A,
+ Ncommaaccent: 0x0145,
+ Ndotaccent: 0x1E44,
+ Ndotbelow: 0x1E46,
+ Nhookleft: 0x019D,
+ Nineroman: 0x2168,
+ Nj: 0x01CB,
+ Njecyrillic: 0x040A,
+ Nlinebelow: 0x1E48,
+ Nmonospace: 0xFF2E,
+ Nowarmenian: 0x0546,
+ Nsmall: 0xF76E,
+ Ntilde: 0x00D1,
+ Ntildesmall: 0xF7F1,
+ Nu: 0x039D,
+ O: 0x004F,
+ OE: 0x0152,
+ OEsmall: 0xF6FA,
+ Oacute: 0x00D3,
+ Oacutesmall: 0xF7F3,
+ Obarredcyrillic: 0x04E8,
+ Obarreddieresiscyrillic: 0x04EA,
+ Obreve: 0x014E,
+ Ocaron: 0x01D1,
+ Ocenteredtilde: 0x019F,
+ Ocircle: 0x24C4,
+ Ocircumflex: 0x00D4,
+ Ocircumflexacute: 0x1ED0,
+ Ocircumflexdotbelow: 0x1ED8,
+ Ocircumflexgrave: 0x1ED2,
+ Ocircumflexhookabove: 0x1ED4,
+ Ocircumflexsmall: 0xF7F4,
+ Ocircumflextilde: 0x1ED6,
+ Ocyrillic: 0x041E,
+ Odblacute: 0x0150,
+ Odblgrave: 0x020C,
+ Odieresis: 0x00D6,
+ Odieresiscyrillic: 0x04E6,
+ Odieresissmall: 0xF7F6,
+ Odotbelow: 0x1ECC,
+ Ogoneksmall: 0xF6FB,
+ Ograve: 0x00D2,
+ Ogravesmall: 0xF7F2,
+ Oharmenian: 0x0555,
+ Ohm: 0x2126,
+ Ohookabove: 0x1ECE,
+ Ohorn: 0x01A0,
+ Ohornacute: 0x1EDA,
+ Ohorndotbelow: 0x1EE2,
+ Ohorngrave: 0x1EDC,
+ Ohornhookabove: 0x1EDE,
+ Ohorntilde: 0x1EE0,
+ Ohungarumlaut: 0x0150,
+ Oi: 0x01A2,
+ Oinvertedbreve: 0x020E,
+ Omacron: 0x014C,
+ Omacronacute: 0x1E52,
+ Omacrongrave: 0x1E50,
+ Omega: 0x2126,
+ Omegacyrillic: 0x0460,
+ Omegagreek: 0x03A9,
+ Omegaroundcyrillic: 0x047A,
+ Omegatitlocyrillic: 0x047C,
+ Omegatonos: 0x038F,
+ Omicron: 0x039F,
+ Omicrontonos: 0x038C,
+ Omonospace: 0xFF2F,
+ Oneroman: 0x2160,
+ Oogonek: 0x01EA,
+ Oogonekmacron: 0x01EC,
+ Oopen: 0x0186,
+ Oslash: 0x00D8,
+ Oslashacute: 0x01FE,
+ Oslashsmall: 0xF7F8,
+ Osmall: 0xF76F,
+ Ostrokeacute: 0x01FE,
+ Otcyrillic: 0x047E,
+ Otilde: 0x00D5,
+ Otildeacute: 0x1E4C,
+ Otildedieresis: 0x1E4E,
+ Otildesmall: 0xF7F5,
+ P: 0x0050,
+ Pacute: 0x1E54,
+ Pcircle: 0x24C5,
+ Pdotaccent: 0x1E56,
+ Pecyrillic: 0x041F,
+ Peharmenian: 0x054A,
+ Pemiddlehookcyrillic: 0x04A6,
+ Phi: 0x03A6,
+ Phook: 0x01A4,
+ Pi: 0x03A0,
+ Piwrarmenian: 0x0553,
+ Pmonospace: 0xFF30,
+ Psi: 0x03A8,
+ Psicyrillic: 0x0470,
+ Psmall: 0xF770,
+ Q: 0x0051,
+ Qcircle: 0x24C6,
+ Qmonospace: 0xFF31,
+ Qsmall: 0xF771,
+ R: 0x0052,
+ Raarmenian: 0x054C,
+ Racute: 0x0154,
+ Rcaron: 0x0158,
+ Rcedilla: 0x0156,
+ Rcircle: 0x24C7,
+ Rcommaaccent: 0x0156,
+ Rdblgrave: 0x0210,
+ Rdotaccent: 0x1E58,
+ Rdotbelow: 0x1E5A,
+ Rdotbelowmacron: 0x1E5C,
+ Reharmenian: 0x0550,
+ Rfraktur: 0x211C,
+ Rho: 0x03A1,
+ Ringsmall: 0xF6FC,
+ Rinvertedbreve: 0x0212,
+ Rlinebelow: 0x1E5E,
+ Rmonospace: 0xFF32,
+ Rsmall: 0xF772,
+ Rsmallinverted: 0x0281,
+ Rsmallinvertedsuperior: 0x02B6,
+ S: 0x0053,
+ SF010000: 0x250C,
+ SF020000: 0x2514,
+ SF030000: 0x2510,
+ SF040000: 0x2518,
+ SF050000: 0x253C,
+ SF060000: 0x252C,
+ SF070000: 0x2534,
+ SF080000: 0x251C,
+ SF090000: 0x2524,
+ SF100000: 0x2500,
+ SF110000: 0x2502,
+ SF190000: 0x2561,
+ SF200000: 0x2562,
+ SF210000: 0x2556,
+ SF220000: 0x2555,
+ SF230000: 0x2563,
+ SF240000: 0x2551,
+ SF250000: 0x2557,
+ SF260000: 0x255D,
+ SF270000: 0x255C,
+ SF280000: 0x255B,
+ SF360000: 0x255E,
+ SF370000: 0x255F,
+ SF380000: 0x255A,
+ SF390000: 0x2554,
+ SF400000: 0x2569,
+ SF410000: 0x2566,
+ SF420000: 0x2560,
+ SF430000: 0x2550,
+ SF440000: 0x256C,
+ SF450000: 0x2567,
+ SF460000: 0x2568,
+ SF470000: 0x2564,
+ SF480000: 0x2565,
+ SF490000: 0x2559,
+ SF500000: 0x2558,
+ SF510000: 0x2552,
+ SF520000: 0x2553,
+ SF530000: 0x256B,
+ SF540000: 0x256A,
+ Sacute: 0x015A,
+ Sacutedotaccent: 0x1E64,
+ Sampigreek: 0x03E0,
+ Scaron: 0x0160,
+ Scarondotaccent: 0x1E66,
+ Scaronsmall: 0xF6FD,
+ Scedilla: 0x015E,
+ Schwa: 0x018F,
+ Schwacyrillic: 0x04D8,
+ Schwadieresiscyrillic: 0x04DA,
+ Scircle: 0x24C8,
+ Scircumflex: 0x015C,
+ Scommaaccent: 0x0218,
+ Sdotaccent: 0x1E60,
+ Sdotbelow: 0x1E62,
+ Sdotbelowdotaccent: 0x1E68,
+ Seharmenian: 0x054D,
+ Sevenroman: 0x2166,
+ Shaarmenian: 0x0547,
+ Shacyrillic: 0x0428,
+ Shchacyrillic: 0x0429,
+ Sheicoptic: 0x03E2,
+ Shhacyrillic: 0x04BA,
+ Shimacoptic: 0x03EC,
+ Sigma: 0x03A3,
+ Sixroman: 0x2165,
+ Smonospace: 0xFF33,
+ Softsigncyrillic: 0x042C,
+ Ssmall: 0xF773,
+ Stigmagreek: 0x03DA,
+ T: 0x0054,
+ Tau: 0x03A4,
+ Tbar: 0x0166,
+ Tcaron: 0x0164,
+ Tcedilla: 0x0162,
+ Tcircle: 0x24C9,
+ Tcircumflexbelow: 0x1E70,
+ Tcommaaccent: 0x0162,
+ Tdotaccent: 0x1E6A,
+ Tdotbelow: 0x1E6C,
+ Tecyrillic: 0x0422,
+ Tedescendercyrillic: 0x04AC,
+ Tenroman: 0x2169,
+ Tetsecyrillic: 0x04B4,
+ Theta: 0x0398,
+ Thook: 0x01AC,
+ Thorn: 0x00DE,
+ Thornsmall: 0xF7FE,
+ Threeroman: 0x2162,
+ Tildesmall: 0xF6FE,
+ Tiwnarmenian: 0x054F,
+ Tlinebelow: 0x1E6E,
+ Tmonospace: 0xFF34,
+ Toarmenian: 0x0539,
+ Tonefive: 0x01BC,
+ Tonesix: 0x0184,
+ Tonetwo: 0x01A7,
+ Tretroflexhook: 0x01AE,
+ Tsecyrillic: 0x0426,
+ Tshecyrillic: 0x040B,
+ Tsmall: 0xF774,
+ Twelveroman: 0x216B,
+ Tworoman: 0x2161,
+ U: 0x0055,
+ Uacute: 0x00DA,
+ Uacutesmall: 0xF7FA,
+ Ubreve: 0x016C,
+ Ucaron: 0x01D3,
+ Ucircle: 0x24CA,
+ Ucircumflex: 0x00DB,
+ Ucircumflexbelow: 0x1E76,
+ Ucircumflexsmall: 0xF7FB,
+ Ucyrillic: 0x0423,
+ Udblacute: 0x0170,
+ Udblgrave: 0x0214,
+ Udieresis: 0x00DC,
+ Udieresisacute: 0x01D7,
+ Udieresisbelow: 0x1E72,
+ Udieresiscaron: 0x01D9,
+ Udieresiscyrillic: 0x04F0,
+ Udieresisgrave: 0x01DB,
+ Udieresismacron: 0x01D5,
+ Udieresissmall: 0xF7FC,
+ Udotbelow: 0x1EE4,
+ Ugrave: 0x00D9,
+ Ugravesmall: 0xF7F9,
+ Uhookabove: 0x1EE6,
+ Uhorn: 0x01AF,
+ Uhornacute: 0x1EE8,
+ Uhorndotbelow: 0x1EF0,
+ Uhorngrave: 0x1EEA,
+ Uhornhookabove: 0x1EEC,
+ Uhorntilde: 0x1EEE,
+ Uhungarumlaut: 0x0170,
+ Uhungarumlautcyrillic: 0x04F2,
+ Uinvertedbreve: 0x0216,
+ Ukcyrillic: 0x0478,
+ Umacron: 0x016A,
+ Umacroncyrillic: 0x04EE,
+ Umacrondieresis: 0x1E7A,
+ Umonospace: 0xFF35,
+ Uogonek: 0x0172,
+ Upsilon: 0x03A5,
+ Upsilon1: 0x03D2,
+ Upsilonacutehooksymbolgreek: 0x03D3,
+ Upsilonafrican: 0x01B1,
+ Upsilondieresis: 0x03AB,
+ Upsilondieresishooksymbolgreek: 0x03D4,
+ Upsilonhooksymbol: 0x03D2,
+ Upsilontonos: 0x038E,
+ Uring: 0x016E,
+ Ushortcyrillic: 0x040E,
+ Usmall: 0xF775,
+ Ustraightcyrillic: 0x04AE,
+ Ustraightstrokecyrillic: 0x04B0,
+ Utilde: 0x0168,
+ Utildeacute: 0x1E78,
+ Utildebelow: 0x1E74,
+ V: 0x0056,
+ Vcircle: 0x24CB,
+ Vdotbelow: 0x1E7E,
+ Vecyrillic: 0x0412,
+ Vewarmenian: 0x054E,
+ Vhook: 0x01B2,
+ Vmonospace: 0xFF36,
+ Voarmenian: 0x0548,
+ Vsmall: 0xF776,
+ Vtilde: 0x1E7C,
+ W: 0x0057,
+ Wacute: 0x1E82,
+ Wcircle: 0x24CC,
+ Wcircumflex: 0x0174,
+ Wdieresis: 0x1E84,
+ Wdotaccent: 0x1E86,
+ Wdotbelow: 0x1E88,
+ Wgrave: 0x1E80,
+ Wmonospace: 0xFF37,
+ Wsmall: 0xF777,
+ X: 0x0058,
+ Xcircle: 0x24CD,
+ Xdieresis: 0x1E8C,
+ Xdotaccent: 0x1E8A,
+ Xeharmenian: 0x053D,
+ Xi: 0x039E,
+ Xmonospace: 0xFF38,
+ Xsmall: 0xF778,
+ Y: 0x0059,
+ Yacute: 0x00DD,
+ Yacutesmall: 0xF7FD,
+ Yatcyrillic: 0x0462,
+ Ycircle: 0x24CE,
+ Ycircumflex: 0x0176,
+ Ydieresis: 0x0178,
+ Ydieresissmall: 0xF7FF,
+ Ydotaccent: 0x1E8E,
+ Ydotbelow: 0x1EF4,
+ Yericyrillic: 0x042B,
+ Yerudieresiscyrillic: 0x04F8,
+ Ygrave: 0x1EF2,
+ Yhook: 0x01B3,
+ Yhookabove: 0x1EF6,
+ Yiarmenian: 0x0545,
+ Yicyrillic: 0x0407,
+ Yiwnarmenian: 0x0552,
+ Ymonospace: 0xFF39,
+ Ysmall: 0xF779,
+ Ytilde: 0x1EF8,
+ Yusbigcyrillic: 0x046A,
+ Yusbigiotifiedcyrillic: 0x046C,
+ Yuslittlecyrillic: 0x0466,
+ Yuslittleiotifiedcyrillic: 0x0468,
+ Z: 0x005A,
+ Zaarmenian: 0x0536,
+ Zacute: 0x0179,
+ Zcaron: 0x017D,
+ Zcaronsmall: 0xF6FF,
+ Zcircle: 0x24CF,
+ Zcircumflex: 0x1E90,
+ Zdot: 0x017B,
+ Zdotaccent: 0x017B,
+ Zdotbelow: 0x1E92,
+ Zecyrillic: 0x0417,
+ Zedescendercyrillic: 0x0498,
+ Zedieresiscyrillic: 0x04DE,
+ Zeta: 0x0396,
+ Zhearmenian: 0x053A,
+ Zhebrevecyrillic: 0x04C1,
+ Zhecyrillic: 0x0416,
+ Zhedescendercyrillic: 0x0496,
+ Zhedieresiscyrillic: 0x04DC,
+ Zlinebelow: 0x1E94,
+ Zmonospace: 0xFF3A,
+ Zsmall: 0xF77A,
+ Zstroke: 0x01B5,
+ a: 0x0061,
+ aabengali: 0x0986,
+ aacute: 0x00E1,
+ aadeva: 0x0906,
+ aagujarati: 0x0A86,
+ aagurmukhi: 0x0A06,
+ aamatragurmukhi: 0x0A3E,
+ aarusquare: 0x3303,
+ aavowelsignbengali: 0x09BE,
+ aavowelsigndeva: 0x093E,
+ aavowelsigngujarati: 0x0ABE,
+ abbreviationmarkarmenian: 0x055F,
+ abbreviationsigndeva: 0x0970,
+ abengali: 0x0985,
+ abopomofo: 0x311A,
+ abreve: 0x0103,
+ abreveacute: 0x1EAF,
+ abrevecyrillic: 0x04D1,
+ abrevedotbelow: 0x1EB7,
+ abrevegrave: 0x1EB1,
+ abrevehookabove: 0x1EB3,
+ abrevetilde: 0x1EB5,
+ acaron: 0x01CE,
+ acircle: 0x24D0,
+ acircumflex: 0x00E2,
+ acircumflexacute: 0x1EA5,
+ acircumflexdotbelow: 0x1EAD,
+ acircumflexgrave: 0x1EA7,
+ acircumflexhookabove: 0x1EA9,
+ acircumflextilde: 0x1EAB,
+ acute: 0x00B4,
+ acutebelowcmb: 0x0317,
+ acutecmb: 0x0301,
+ acutecomb: 0x0301,
+ acutedeva: 0x0954,
+ acutelowmod: 0x02CF,
+ acutetonecmb: 0x0341,
+ acyrillic: 0x0430,
+ adblgrave: 0x0201,
+ addakgurmukhi: 0x0A71,
+ adeva: 0x0905,
+ adieresis: 0x00E4,
+ adieresiscyrillic: 0x04D3,
+ adieresismacron: 0x01DF,
+ adotbelow: 0x1EA1,
+ adotmacron: 0x01E1,
+ ae: 0x00E6,
+ aeacute: 0x01FD,
+ aekorean: 0x3150,
+ aemacron: 0x01E3,
+ afii00208: 0x2015,
+ afii08941: 0x20A4,
+ afii10017: 0x0410,
+ afii10018: 0x0411,
+ afii10019: 0x0412,
+ afii10020: 0x0413,
+ afii10021: 0x0414,
+ afii10022: 0x0415,
+ afii10023: 0x0401,
+ afii10024: 0x0416,
+ afii10025: 0x0417,
+ afii10026: 0x0418,
+ afii10027: 0x0419,
+ afii10028: 0x041A,
+ afii10029: 0x041B,
+ afii10030: 0x041C,
+ afii10031: 0x041D,
+ afii10032: 0x041E,
+ afii10033: 0x041F,
+ afii10034: 0x0420,
+ afii10035: 0x0421,
+ afii10036: 0x0422,
+ afii10037: 0x0423,
+ afii10038: 0x0424,
+ afii10039: 0x0425,
+ afii10040: 0x0426,
+ afii10041: 0x0427,
+ afii10042: 0x0428,
+ afii10043: 0x0429,
+ afii10044: 0x042A,
+ afii10045: 0x042B,
+ afii10046: 0x042C,
+ afii10047: 0x042D,
+ afii10048: 0x042E,
+ afii10049: 0x042F,
+ afii10050: 0x0490,
+ afii10051: 0x0402,
+ afii10052: 0x0403,
+ afii10053: 0x0404,
+ afii10054: 0x0405,
+ afii10055: 0x0406,
+ afii10056: 0x0407,
+ afii10057: 0x0408,
+ afii10058: 0x0409,
+ afii10059: 0x040A,
+ afii10060: 0x040B,
+ afii10061: 0x040C,
+ afii10062: 0x040E,
+ afii10063: 0xF6C4,
+ afii10064: 0xF6C5,
+ afii10065: 0x0430,
+ afii10066: 0x0431,
+ afii10067: 0x0432,
+ afii10068: 0x0433,
+ afii10069: 0x0434,
+ afii10070: 0x0435,
+ afii10071: 0x0451,
+ afii10072: 0x0436,
+ afii10073: 0x0437,
+ afii10074: 0x0438,
+ afii10075: 0x0439,
+ afii10076: 0x043A,
+ afii10077: 0x043B,
+ afii10078: 0x043C,
+ afii10079: 0x043D,
+ afii10080: 0x043E,
+ afii10081: 0x043F,
+ afii10082: 0x0440,
+ afii10083: 0x0441,
+ afii10084: 0x0442,
+ afii10085: 0x0443,
+ afii10086: 0x0444,
+ afii10087: 0x0445,
+ afii10088: 0x0446,
+ afii10089: 0x0447,
+ afii10090: 0x0448,
+ afii10091: 0x0449,
+ afii10092: 0x044A,
+ afii10093: 0x044B,
+ afii10094: 0x044C,
+ afii10095: 0x044D,
+ afii10096: 0x044E,
+ afii10097: 0x044F,
+ afii10098: 0x0491,
+ afii10099: 0x0452,
+ afii10100: 0x0453,
+ afii10101: 0x0454,
+ afii10102: 0x0455,
+ afii10103: 0x0456,
+ afii10104: 0x0457,
+ afii10105: 0x0458,
+ afii10106: 0x0459,
+ afii10107: 0x045A,
+ afii10108: 0x045B,
+ afii10109: 0x045C,
+ afii10110: 0x045E,
+ afii10145: 0x040F,
+ afii10146: 0x0462,
+ afii10147: 0x0472,
+ afii10148: 0x0474,
+ afii10192: 0xF6C6,
+ afii10193: 0x045F,
+ afii10194: 0x0463,
+ afii10195: 0x0473,
+ afii10196: 0x0475,
+ afii10831: 0xF6C7,
+ afii10832: 0xF6C8,
+ afii10846: 0x04D9,
+ afii299: 0x200E,
+ afii300: 0x200F,
+ afii301: 0x200D,
+ afii57381: 0x066A,
+ afii57388: 0x060C,
+ afii57392: 0x0660,
+ afii57393: 0x0661,
+ afii57394: 0x0662,
+ afii57395: 0x0663,
+ afii57396: 0x0664,
+ afii57397: 0x0665,
+ afii57398: 0x0666,
+ afii57399: 0x0667,
+ afii57400: 0x0668,
+ afii57401: 0x0669,
+ afii57403: 0x061B,
+ afii57407: 0x061F,
+ afii57409: 0x0621,
+ afii57410: 0x0622,
+ afii57411: 0x0623,
+ afii57412: 0x0624,
+ afii57413: 0x0625,
+ afii57414: 0x0626,
+ afii57415: 0x0627,
+ afii57416: 0x0628,
+ afii57417: 0x0629,
+ afii57418: 0x062A,
+ afii57419: 0x062B,
+ afii57420: 0x062C,
+ afii57421: 0x062D,
+ afii57422: 0x062E,
+ afii57423: 0x062F,
+ afii57424: 0x0630,
+ afii57425: 0x0631,
+ afii57426: 0x0632,
+ afii57427: 0x0633,
+ afii57428: 0x0634,
+ afii57429: 0x0635,
+ afii57430: 0x0636,
+ afii57431: 0x0637,
+ afii57432: 0x0638,
+ afii57433: 0x0639,
+ afii57434: 0x063A,
+ afii57440: 0x0640,
+ afii57441: 0x0641,
+ afii57442: 0x0642,
+ afii57443: 0x0643,
+ afii57444: 0x0644,
+ afii57445: 0x0645,
+ afii57446: 0x0646,
+ afii57448: 0x0648,
+ afii57449: 0x0649,
+ afii57450: 0x064A,
+ afii57451: 0x064B,
+ afii57452: 0x064C,
+ afii57453: 0x064D,
+ afii57454: 0x064E,
+ afii57455: 0x064F,
+ afii57456: 0x0650,
+ afii57457: 0x0651,
+ afii57458: 0x0652,
+ afii57470: 0x0647,
+ afii57505: 0x06A4,
+ afii57506: 0x067E,
+ afii57507: 0x0686,
+ afii57508: 0x0698,
+ afii57509: 0x06AF,
+ afii57511: 0x0679,
+ afii57512: 0x0688,
+ afii57513: 0x0691,
+ afii57514: 0x06BA,
+ afii57519: 0x06D2,
+ afii57534: 0x06D5,
+ afii57636: 0x20AA,
+ afii57645: 0x05BE,
+ afii57658: 0x05C3,
+ afii57664: 0x05D0,
+ afii57665: 0x05D1,
+ afii57666: 0x05D2,
+ afii57667: 0x05D3,
+ afii57668: 0x05D4,
+ afii57669: 0x05D5,
+ afii57670: 0x05D6,
+ afii57671: 0x05D7,
+ afii57672: 0x05D8,
+ afii57673: 0x05D9,
+ afii57674: 0x05DA,
+ afii57675: 0x05DB,
+ afii57676: 0x05DC,
+ afii57677: 0x05DD,
+ afii57678: 0x05DE,
+ afii57679: 0x05DF,
+ afii57680: 0x05E0,
+ afii57681: 0x05E1,
+ afii57682: 0x05E2,
+ afii57683: 0x05E3,
+ afii57684: 0x05E4,
+ afii57685: 0x05E5,
+ afii57686: 0x05E6,
+ afii57687: 0x05E7,
+ afii57688: 0x05E8,
+ afii57689: 0x05E9,
+ afii57690: 0x05EA,
+ afii57694: 0xFB2A,
+ afii57695: 0xFB2B,
+ afii57700: 0xFB4B,
+ afii57705: 0xFB1F,
+ afii57716: 0x05F0,
+ afii57717: 0x05F1,
+ afii57718: 0x05F2,
+ afii57723: 0xFB35,
+ afii57793: 0x05B4,
+ afii57794: 0x05B5,
+ afii57795: 0x05B6,
+ afii57796: 0x05BB,
+ afii57797: 0x05B8,
+ afii57798: 0x05B7,
+ afii57799: 0x05B0,
+ afii57800: 0x05B2,
+ afii57801: 0x05B1,
+ afii57802: 0x05B3,
+ afii57803: 0x05C2,
+ afii57804: 0x05C1,
+ afii57806: 0x05B9,
+ afii57807: 0x05BC,
+ afii57839: 0x05BD,
+ afii57841: 0x05BF,
+ afii57842: 0x05C0,
+ afii57929: 0x02BC,
+ afii61248: 0x2105,
+ afii61289: 0x2113,
+ afii61352: 0x2116,
+ afii61573: 0x202C,
+ afii61574: 0x202D,
+ afii61575: 0x202E,
+ afii61664: 0x200C,
+ afii63167: 0x066D,
+ afii64937: 0x02BD,
+ agrave: 0x00E0,
+ agujarati: 0x0A85,
+ agurmukhi: 0x0A05,
+ ahiragana: 0x3042,
+ ahookabove: 0x1EA3,
+ aibengali: 0x0990,
+ aibopomofo: 0x311E,
+ aideva: 0x0910,
+ aiecyrillic: 0x04D5,
+ aigujarati: 0x0A90,
+ aigurmukhi: 0x0A10,
+ aimatragurmukhi: 0x0A48,
+ ainarabic: 0x0639,
+ ainfinalarabic: 0xFECA,
+ aininitialarabic: 0xFECB,
+ ainmedialarabic: 0xFECC,
+ ainvertedbreve: 0x0203,
+ aivowelsignbengali: 0x09C8,
+ aivowelsigndeva: 0x0948,
+ aivowelsigngujarati: 0x0AC8,
+ akatakana: 0x30A2,
+ akatakanahalfwidth: 0xFF71,
+ akorean: 0x314F,
+ alef: 0x05D0,
+ alefarabic: 0x0627,
+ alefdageshhebrew: 0xFB30,
+ aleffinalarabic: 0xFE8E,
+ alefhamzaabovearabic: 0x0623,
+ alefhamzaabovefinalarabic: 0xFE84,
+ alefhamzabelowarabic: 0x0625,
+ alefhamzabelowfinalarabic: 0xFE88,
+ alefhebrew: 0x05D0,
+ aleflamedhebrew: 0xFB4F,
+ alefmaddaabovearabic: 0x0622,
+ alefmaddaabovefinalarabic: 0xFE82,
+ alefmaksuraarabic: 0x0649,
+ alefmaksurafinalarabic: 0xFEF0,
+ alefmaksurainitialarabic: 0xFEF3,
+ alefmaksuramedialarabic: 0xFEF4,
+ alefpatahhebrew: 0xFB2E,
+ alefqamatshebrew: 0xFB2F,
+ aleph: 0x2135,
+ allequal: 0x224C,
+ alpha: 0x03B1,
+ alphatonos: 0x03AC,
+ amacron: 0x0101,
+ amonospace: 0xFF41,
+ ampersand: 0x0026,
+ ampersandmonospace: 0xFF06,
+ ampersandsmall: 0xF726,
+ amsquare: 0x33C2,
+ anbopomofo: 0x3122,
+ angbopomofo: 0x3124,
+ angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
+ angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
+ angkhankhuthai: 0x0E5A,
+ angle: 0x2220,
+ anglebracketleft: 0x3008,
+ anglebracketleftvertical: 0xFE3F,
+ anglebracketright: 0x3009,
+ anglebracketrightvertical: 0xFE40,
+ angleleft: 0x2329,
+ angleright: 0x232A,
+ angstrom: 0x212B,
+ anoteleia: 0x0387,
+ anudattadeva: 0x0952,
+ anusvarabengali: 0x0982,
+ anusvaradeva: 0x0902,
+ anusvaragujarati: 0x0A82,
+ aogonek: 0x0105,
+ apaatosquare: 0x3300,
+ aparen: 0x249C,
+ apostrophearmenian: 0x055A,
+ apostrophemod: 0x02BC,
+ apple: 0xF8FF,
+ approaches: 0x2250,
+ approxequal: 0x2248,
+ approxequalorimage: 0x2252,
+ approximatelyequal: 0x2245,
+ araeaekorean: 0x318E,
+ araeakorean: 0x318D,
+ arc: 0x2312,
+ arighthalfring: 0x1E9A,
+ aring: 0x00E5,
+ aringacute: 0x01FB,
+ aringbelow: 0x1E01,
+ arrowboth: 0x2194,
+ arrowdashdown: 0x21E3,
+ arrowdashleft: 0x21E0,
+ arrowdashright: 0x21E2,
+ arrowdashup: 0x21E1,
+ arrowdblboth: 0x21D4,
+ arrowdbldown: 0x21D3,
+ arrowdblleft: 0x21D0,
+ arrowdblright: 0x21D2,
+ arrowdblup: 0x21D1,
+ arrowdown: 0x2193,
+ arrowdownleft: 0x2199,
+ arrowdownright: 0x2198,
+ arrowdownwhite: 0x21E9,
+ arrowheaddownmod: 0x02C5,
+ arrowheadleftmod: 0x02C2,
+ arrowheadrightmod: 0x02C3,
+ arrowheadupmod: 0x02C4,
+ arrowhorizex: 0xF8E7,
+ arrowleft: 0x2190,
+ arrowleftdbl: 0x21D0,
+ arrowleftdblstroke: 0x21CD,
+ arrowleftoverright: 0x21C6,
+ arrowleftwhite: 0x21E6,
+ arrowright: 0x2192,
+ arrowrightdblstroke: 0x21CF,
+ arrowrightheavy: 0x279E,
+ arrowrightoverleft: 0x21C4,
+ arrowrightwhite: 0x21E8,
+ arrowtableft: 0x21E4,
+ arrowtabright: 0x21E5,
+ arrowup: 0x2191,
+ arrowupdn: 0x2195,
+ arrowupdnbse: 0x21A8,
+ arrowupdownbase: 0x21A8,
+ arrowupleft: 0x2196,
+ arrowupleftofdown: 0x21C5,
+ arrowupright: 0x2197,
+ arrowupwhite: 0x21E7,
+ arrowvertex: 0xF8E6,
+ asciicircum: 0x005E,
+ asciicircummonospace: 0xFF3E,
+ asciitilde: 0x007E,
+ asciitildemonospace: 0xFF5E,
+ ascript: 0x0251,
+ ascriptturned: 0x0252,
+ asmallhiragana: 0x3041,
+ asmallkatakana: 0x30A1,
+ asmallkatakanahalfwidth: 0xFF67,
+ asterisk: 0x002A,
+ asteriskaltonearabic: 0x066D,
+ asteriskarabic: 0x066D,
+ asteriskmath: 0x2217,
+ asteriskmonospace: 0xFF0A,
+ asterisksmall: 0xFE61,
+ asterism: 0x2042,
+ asuperior: 0xF6E9,
+ asymptoticallyequal: 0x2243,
+ at: 0x0040,
+ atilde: 0x00E3,
+ atmonospace: 0xFF20,
+ atsmall: 0xFE6B,
+ aturned: 0x0250,
+ aubengali: 0x0994,
+ aubopomofo: 0x3120,
+ audeva: 0x0914,
+ augujarati: 0x0A94,
+ augurmukhi: 0x0A14,
+ aulengthmarkbengali: 0x09D7,
+ aumatragurmukhi: 0x0A4C,
+ auvowelsignbengali: 0x09CC,
+ auvowelsigndeva: 0x094C,
+ auvowelsigngujarati: 0x0ACC,
+ avagrahadeva: 0x093D,
+ aybarmenian: 0x0561,
+ ayin: 0x05E2,
+ ayinaltonehebrew: 0xFB20,
+ ayinhebrew: 0x05E2,
+ b: 0x0062,
+ babengali: 0x09AC,
+ backslash: 0x005C,
+ backslashmonospace: 0xFF3C,
+ badeva: 0x092C,
+ bagujarati: 0x0AAC,
+ bagurmukhi: 0x0A2C,
+ bahiragana: 0x3070,
+ bahtthai: 0x0E3F,
+ bakatakana: 0x30D0,
+ bar: 0x007C,
+ barmonospace: 0xFF5C,
+ bbopomofo: 0x3105,
+ bcircle: 0x24D1,
+ bdotaccent: 0x1E03,
+ bdotbelow: 0x1E05,
+ beamedsixteenthnotes: 0x266C,
+ because: 0x2235,
+ becyrillic: 0x0431,
+ beharabic: 0x0628,
+ behfinalarabic: 0xFE90,
+ behinitialarabic: 0xFE91,
+ behiragana: 0x3079,
+ behmedialarabic: 0xFE92,
+ behmeeminitialarabic: 0xFC9F,
+ behmeemisolatedarabic: 0xFC08,
+ behnoonfinalarabic: 0xFC6D,
+ bekatakana: 0x30D9,
+ benarmenian: 0x0562,
+ bet: 0x05D1,
+ beta: 0x03B2,
+ betasymbolgreek: 0x03D0,
+ betdagesh: 0xFB31,
+ betdageshhebrew: 0xFB31,
+ bethebrew: 0x05D1,
+ betrafehebrew: 0xFB4C,
+ bhabengali: 0x09AD,
+ bhadeva: 0x092D,
+ bhagujarati: 0x0AAD,
+ bhagurmukhi: 0x0A2D,
+ bhook: 0x0253,
+ bihiragana: 0x3073,
+ bikatakana: 0x30D3,
+ bilabialclick: 0x0298,
+ bindigurmukhi: 0x0A02,
+ birusquare: 0x3331,
+ blackcircle: 0x25CF,
+ blackdiamond: 0x25C6,
+ blackdownpointingtriangle: 0x25BC,
+ blackleftpointingpointer: 0x25C4,
+ blackleftpointingtriangle: 0x25C0,
+ blacklenticularbracketleft: 0x3010,
+ blacklenticularbracketleftvertical: 0xFE3B,
+ blacklenticularbracketright: 0x3011,
+ blacklenticularbracketrightvertical: 0xFE3C,
+ blacklowerlefttriangle: 0x25E3,
+ blacklowerrighttriangle: 0x25E2,
+ blackrectangle: 0x25AC,
+ blackrightpointingpointer: 0x25BA,
+ blackrightpointingtriangle: 0x25B6,
+ blacksmallsquare: 0x25AA,
+ blacksmilingface: 0x263B,
+ blacksquare: 0x25A0,
+ blackstar: 0x2605,
+ blackupperlefttriangle: 0x25E4,
+ blackupperrighttriangle: 0x25E5,
+ blackuppointingsmalltriangle: 0x25B4,
+ blackuppointingtriangle: 0x25B2,
+ blank: 0x2423,
+ blinebelow: 0x1E07,
+ block: 0x2588,
+ bmonospace: 0xFF42,
+ bobaimaithai: 0x0E1A,
+ bohiragana: 0x307C,
+ bokatakana: 0x30DC,
+ bparen: 0x249D,
+ bqsquare: 0x33C3,
+ braceex: 0xF8F4,
+ braceleft: 0x007B,
+ braceleftbt: 0xF8F3,
+ braceleftmid: 0xF8F2,
+ braceleftmonospace: 0xFF5B,
+ braceleftsmall: 0xFE5B,
+ bracelefttp: 0xF8F1,
+ braceleftvertical: 0xFE37,
+ braceright: 0x007D,
+ bracerightbt: 0xF8FE,
+ bracerightmid: 0xF8FD,
+ bracerightmonospace: 0xFF5D,
+ bracerightsmall: 0xFE5C,
+ bracerighttp: 0xF8FC,
+ bracerightvertical: 0xFE38,
+ bracketleft: 0x005B,
+ bracketleftbt: 0xF8F0,
+ bracketleftex: 0xF8EF,
+ bracketleftmonospace: 0xFF3B,
+ bracketlefttp: 0xF8EE,
+ bracketright: 0x005D,
+ bracketrightbt: 0xF8FB,
+ bracketrightex: 0xF8FA,
+ bracketrightmonospace: 0xFF3D,
+ bracketrighttp: 0xF8F9,
+ breve: 0x02D8,
+ brevebelowcmb: 0x032E,
+ brevecmb: 0x0306,
+ breveinvertedbelowcmb: 0x032F,
+ breveinvertedcmb: 0x0311,
+ breveinverteddoublecmb: 0x0361,
+ bridgebelowcmb: 0x032A,
+ bridgeinvertedbelowcmb: 0x033A,
+ brokenbar: 0x00A6,
+ bstroke: 0x0180,
+ bsuperior: 0xF6EA,
+ btopbar: 0x0183,
+ buhiragana: 0x3076,
+ bukatakana: 0x30D6,
+ bullet: 0x2022,
+ bulletinverse: 0x25D8,
+ bulletoperator: 0x2219,
+ bullseye: 0x25CE,
+ c: 0x0063,
+ caarmenian: 0x056E,
+ cabengali: 0x099A,
+ cacute: 0x0107,
+ cadeva: 0x091A,
+ cagujarati: 0x0A9A,
+ cagurmukhi: 0x0A1A,
+ calsquare: 0x3388,
+ candrabindubengali: 0x0981,
+ candrabinducmb: 0x0310,
+ candrabindudeva: 0x0901,
+ candrabindugujarati: 0x0A81,
+ capslock: 0x21EA,
+ careof: 0x2105,
+ caron: 0x02C7,
+ caronbelowcmb: 0x032C,
+ caroncmb: 0x030C,
+ carriagereturn: 0x21B5,
+ cbopomofo: 0x3118,
+ ccaron: 0x010D,
+ ccedilla: 0x00E7,
+ ccedillaacute: 0x1E09,
+ ccircle: 0x24D2,
+ ccircumflex: 0x0109,
+ ccurl: 0x0255,
+ cdot: 0x010B,
+ cdotaccent: 0x010B,
+ cdsquare: 0x33C5,
+ cedilla: 0x00B8,
+ cedillacmb: 0x0327,
+ cent: 0x00A2,
+ centigrade: 0x2103,
+ centinferior: 0xF6DF,
+ centmonospace: 0xFFE0,
+ centoldstyle: 0xF7A2,
+ centsuperior: 0xF6E0,
+ chaarmenian: 0x0579,
+ chabengali: 0x099B,
+ chadeva: 0x091B,
+ chagujarati: 0x0A9B,
+ chagurmukhi: 0x0A1B,
+ chbopomofo: 0x3114,
+ cheabkhasiancyrillic: 0x04BD,
+ checkmark: 0x2713,
+ checyrillic: 0x0447,
+ chedescenderabkhasiancyrillic: 0x04BF,
+ chedescendercyrillic: 0x04B7,
+ chedieresiscyrillic: 0x04F5,
+ cheharmenian: 0x0573,
+ chekhakassiancyrillic: 0x04CC,
+ cheverticalstrokecyrillic: 0x04B9,
+ chi: 0x03C7,
+ chieuchacirclekorean: 0x3277,
+ chieuchaparenkorean: 0x3217,
+ chieuchcirclekorean: 0x3269,
+ chieuchkorean: 0x314A,
+ chieuchparenkorean: 0x3209,
+ chochangthai: 0x0E0A,
+ chochanthai: 0x0E08,
+ chochingthai: 0x0E09,
+ chochoethai: 0x0E0C,
+ chook: 0x0188,
+ cieucacirclekorean: 0x3276,
+ cieucaparenkorean: 0x3216,
+ cieuccirclekorean: 0x3268,
+ cieuckorean: 0x3148,
+ cieucparenkorean: 0x3208,
+ cieucuparenkorean: 0x321C,
+ circle: 0x25CB,
+ circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
+ circlemultiply: 0x2297,
+ circleot: 0x2299,
+ circleplus: 0x2295,
+ circlepostalmark: 0x3036,
+ circlewithlefthalfblack: 0x25D0,
+ circlewithrighthalfblack: 0x25D1,
+ circumflex: 0x02C6,
+ circumflexbelowcmb: 0x032D,
+ circumflexcmb: 0x0302,
+ clear: 0x2327,
+ clickalveolar: 0x01C2,
+ clickdental: 0x01C0,
+ clicklateral: 0x01C1,
+ clickretroflex: 0x01C3,
+ club: 0x2663,
+ clubsuitblack: 0x2663,
+ clubsuitwhite: 0x2667,
+ cmcubedsquare: 0x33A4,
+ cmonospace: 0xFF43,
+ cmsquaredsquare: 0x33A0,
+ coarmenian: 0x0581,
+ colon: 0x003A,
+ colonmonetary: 0x20A1,
+ colonmonospace: 0xFF1A,
+ colonsign: 0x20A1,
+ colonsmall: 0xFE55,
+ colontriangularhalfmod: 0x02D1,
+ colontriangularmod: 0x02D0,
+ comma: 0x002C,
+ commaabovecmb: 0x0313,
+ commaaboverightcmb: 0x0315,
+ commaaccent: 0xF6C3,
+ commaarabic: 0x060C,
+ commaarmenian: 0x055D,
+ commainferior: 0xF6E1,
+ commamonospace: 0xFF0C,
+ commareversedabovecmb: 0x0314,
+ commareversedmod: 0x02BD,
+ commasmall: 0xFE50,
+ commasuperior: 0xF6E2,
+ commaturnedabovecmb: 0x0312,
+ commaturnedmod: 0x02BB,
+ compass: 0x263C,
+ congruent: 0x2245,
+ contourintegral: 0x222E,
+ control: 0x2303,
+ controlACK: 0x0006,
+ controlBEL: 0x0007,
+ controlBS: 0x0008,
+ controlCAN: 0x0018,
+ controlCR: 0x000D,
+ controlDC1: 0x0011,
+ controlDC2: 0x0012,
+ controlDC3: 0x0013,
+ controlDC4: 0x0014,
+ controlDEL: 0x007F,
+ controlDLE: 0x0010,
+ controlEM: 0x0019,
+ controlENQ: 0x0005,
+ controlEOT: 0x0004,
+ controlESC: 0x001B,
+ controlETB: 0x0017,
+ controlETX: 0x0003,
+ controlFF: 0x000C,
+ controlFS: 0x001C,
+ controlGS: 0x001D,
+ controlHT: 0x0009,
+ controlLF: 0x000A,
+ controlNAK: 0x0015,
+ controlRS: 0x001E,
+ controlSI: 0x000F,
+ controlSO: 0x000E,
+ controlSOT: 0x0002,
+ controlSTX: 0x0001,
+ controlSUB: 0x001A,
+ controlSYN: 0x0016,
+ controlUS: 0x001F,
+ controlVT: 0x000B,
+ copyright: 0x00A9,
+ copyrightsans: 0xF8E9,
+ copyrightserif: 0xF6D9,
+ cornerbracketleft: 0x300C,
+ cornerbracketlefthalfwidth: 0xFF62,
+ cornerbracketleftvertical: 0xFE41,
+ cornerbracketright: 0x300D,
+ cornerbracketrighthalfwidth: 0xFF63,
+ cornerbracketrightvertical: 0xFE42,
+ corporationsquare: 0x337F,
+ cosquare: 0x33C7,
+ coverkgsquare: 0x33C6,
+ cparen: 0x249E,
+ cruzeiro: 0x20A2,
+ cstretched: 0x0297,
+ curlyand: 0x22CF,
+ curlyor: 0x22CE,
+ currency: 0x00A4,
+ cyrBreve: 0xF6D1,
+ cyrFlex: 0xF6D2,
+ cyrbreve: 0xF6D4,
+ cyrflex: 0xF6D5,
+ d: 0x0064,
+ daarmenian: 0x0564,
+ dabengali: 0x09A6,
+ dadarabic: 0x0636,
+ dadeva: 0x0926,
+ dadfinalarabic: 0xFEBE,
+ dadinitialarabic: 0xFEBF,
+ dadmedialarabic: 0xFEC0,
+ dagesh: 0x05BC,
+ dageshhebrew: 0x05BC,
+ dagger: 0x2020,
+ daggerdbl: 0x2021,
+ dagujarati: 0x0AA6,
+ dagurmukhi: 0x0A26,
+ dahiragana: 0x3060,
+ dakatakana: 0x30C0,
+ dalarabic: 0x062F,
+ dalet: 0x05D3,
+ daletdagesh: 0xFB33,
+ daletdageshhebrew: 0xFB33,
+ dalethatafpatah: 0x05D305B2,
+ dalethatafpatahhebrew: 0x05D305B2,
+ dalethatafsegol: 0x05D305B1,
+ dalethatafsegolhebrew: 0x05D305B1,
+ dalethebrew: 0x05D3,
+ dalethiriq: 0x05D305B4,
+ dalethiriqhebrew: 0x05D305B4,
+ daletholam: 0x05D305B9,
+ daletholamhebrew: 0x05D305B9,
+ daletpatah: 0x05D305B7,
+ daletpatahhebrew: 0x05D305B7,
+ daletqamats: 0x05D305B8,
+ daletqamatshebrew: 0x05D305B8,
+ daletqubuts: 0x05D305BB,
+ daletqubutshebrew: 0x05D305BB,
+ daletsegol: 0x05D305B6,
+ daletsegolhebrew: 0x05D305B6,
+ daletsheva: 0x05D305B0,
+ daletshevahebrew: 0x05D305B0,
+ dalettsere: 0x05D305B5,
+ dalettserehebrew: 0x05D305B5,
+ dalfinalarabic: 0xFEAA,
+ dammaarabic: 0x064F,
+ dammalowarabic: 0x064F,
+ dammatanaltonearabic: 0x064C,
+ dammatanarabic: 0x064C,
+ danda: 0x0964,
+ dargahebrew: 0x05A7,
+ dargalefthebrew: 0x05A7,
+ dasiapneumatacyrilliccmb: 0x0485,
+ dblGrave: 0xF6D3,
+ dblanglebracketleft: 0x300A,
+ dblanglebracketleftvertical: 0xFE3D,
+ dblanglebracketright: 0x300B,
+ dblanglebracketrightvertical: 0xFE3E,
+ dblarchinvertedbelowcmb: 0x032B,
+ dblarrowleft: 0x21D4,
+ dblarrowright: 0x21D2,
+ dbldanda: 0x0965,
+ dblgrave: 0xF6D6,
+ dblgravecmb: 0x030F,
+ dblintegral: 0x222C,
+ dbllowline: 0x2017,
+ dbllowlinecmb: 0x0333,
+ dbloverlinecmb: 0x033F,
+ dblprimemod: 0x02BA,
+ dblverticalbar: 0x2016,
+ dblverticallineabovecmb: 0x030E,
+ dbopomofo: 0x3109,
+ dbsquare: 0x33C8,
+ dcaron: 0x010F,
+ dcedilla: 0x1E11,
+ dcircle: 0x24D3,
+ dcircumflexbelow: 0x1E13,
+ dcroat: 0x0111,
+ ddabengali: 0x09A1,
+ ddadeva: 0x0921,
+ ddagujarati: 0x0AA1,
+ ddagurmukhi: 0x0A21,
+ ddalarabic: 0x0688,
+ ddalfinalarabic: 0xFB89,
+ dddhadeva: 0x095C,
+ ddhabengali: 0x09A2,
+ ddhadeva: 0x0922,
+ ddhagujarati: 0x0AA2,
+ ddhagurmukhi: 0x0A22,
+ ddotaccent: 0x1E0B,
+ ddotbelow: 0x1E0D,
+ decimalseparatorarabic: 0x066B,
+ decimalseparatorpersian: 0x066B,
+ decyrillic: 0x0434,
+ degree: 0x00B0,
+ dehihebrew: 0x05AD,
+ dehiragana: 0x3067,
+ deicoptic: 0x03EF,
+ dekatakana: 0x30C7,
+ deleteleft: 0x232B,
+ deleteright: 0x2326,
+ delta: 0x03B4,
+ deltaturned: 0x018D,
+ denominatorminusonenumeratorbengali: 0x09F8,
+ dezh: 0x02A4,
+ dhabengali: 0x09A7,
+ dhadeva: 0x0927,
+ dhagujarati: 0x0AA7,
+ dhagurmukhi: 0x0A27,
+ dhook: 0x0257,
+ dialytikatonos: 0x0385,
+ dialytikatonoscmb: 0x0344,
+ diamond: 0x2666,
+ diamondsuitwhite: 0x2662,
+ dieresis: 0x00A8,
+ dieresisacute: 0xF6D7,
+ dieresisbelowcmb: 0x0324,
+ dieresiscmb: 0x0308,
+ dieresisgrave: 0xF6D8,
+ dieresistonos: 0x0385,
+ dihiragana: 0x3062,
+ dikatakana: 0x30C2,
+ dittomark: 0x3003,
+ divide: 0x00F7,
+ divides: 0x2223,
+ divisionslash: 0x2215,
+ djecyrillic: 0x0452,
+ dkshade: 0x2593,
+ dlinebelow: 0x1E0F,
+ dlsquare: 0x3397,
+ dmacron: 0x0111,
+ dmonospace: 0xFF44,
+ dnblock: 0x2584,
+ dochadathai: 0x0E0E,
+ dodekthai: 0x0E14,
+ dohiragana: 0x3069,
+ dokatakana: 0x30C9,
+ dollar: 0x0024,
+ dollarinferior: 0xF6E3,
+ dollarmonospace: 0xFF04,
+ dollaroldstyle: 0xF724,
+ dollarsmall: 0xFE69,
+ dollarsuperior: 0xF6E4,
+ dong: 0x20AB,
+ dorusquare: 0x3326,
+ dotaccent: 0x02D9,
+ dotaccentcmb: 0x0307,
+ dotbelowcmb: 0x0323,
+ dotbelowcomb: 0x0323,
+ dotkatakana: 0x30FB,
+ dotlessi: 0x0131,
+ dotlessj: 0xF6BE,
+ dotlessjstrokehook: 0x0284,
+ dotmath: 0x22C5,
+ dottedcircle: 0x25CC,
+ doubleyodpatah: 0xFB1F,
+ doubleyodpatahhebrew: 0xFB1F,
+ downtackbelowcmb: 0x031E,
+ downtackmod: 0x02D5,
+ dparen: 0x249F,
+ dsuperior: 0xF6EB,
+ dtail: 0x0256,
+ dtopbar: 0x018C,
+ duhiragana: 0x3065,
+ dukatakana: 0x30C5,
+ dz: 0x01F3,
+ dzaltone: 0x02A3,
+ dzcaron: 0x01C6,
+ dzcurl: 0x02A5,
+ dzeabkhasiancyrillic: 0x04E1,
+ dzecyrillic: 0x0455,
+ dzhecyrillic: 0x045F,
+ e: 0x0065,
+ eacute: 0x00E9,
+ earth: 0x2641,
+ ebengali: 0x098F,
+ ebopomofo: 0x311C,
+ ebreve: 0x0115,
+ ecandradeva: 0x090D,
+ ecandragujarati: 0x0A8D,
+ ecandravowelsigndeva: 0x0945,
+ ecandravowelsigngujarati: 0x0AC5,
+ ecaron: 0x011B,
+ ecedillabreve: 0x1E1D,
+ echarmenian: 0x0565,
+ echyiwnarmenian: 0x0587,
+ ecircle: 0x24D4,
+ ecircumflex: 0x00EA,
+ ecircumflexacute: 0x1EBF,
+ ecircumflexbelow: 0x1E19,
+ ecircumflexdotbelow: 0x1EC7,
+ ecircumflexgrave: 0x1EC1,
+ ecircumflexhookabove: 0x1EC3,
+ ecircumflextilde: 0x1EC5,
+ ecyrillic: 0x0454,
+ edblgrave: 0x0205,
+ edeva: 0x090F,
+ edieresis: 0x00EB,
+ edot: 0x0117,
+ edotaccent: 0x0117,
+ edotbelow: 0x1EB9,
+ eegurmukhi: 0x0A0F,
+ eematragurmukhi: 0x0A47,
+ efcyrillic: 0x0444,
+ egrave: 0x00E8,
+ egujarati: 0x0A8F,
+ eharmenian: 0x0567,
+ ehbopomofo: 0x311D,
+ ehiragana: 0x3048,
+ ehookabove: 0x1EBB,
+ eibopomofo: 0x311F,
+ eight: 0x0038,
+ eightarabic: 0x0668,
+ eightbengali: 0x09EE,
+ eightcircle: 0x2467,
+ eightcircleinversesansserif: 0x2791,
+ eightdeva: 0x096E,
+ eighteencircle: 0x2471,
+ eighteenparen: 0x2485,
+ eighteenperiod: 0x2499,
+ eightgujarati: 0x0AEE,
+ eightgurmukhi: 0x0A6E,
+ eighthackarabic: 0x0668,
+ eighthangzhou: 0x3028,
+ eighthnotebeamed: 0x266B,
+ eightideographicparen: 0x3227,
+ eightinferior: 0x2088,
+ eightmonospace: 0xFF18,
+ eightoldstyle: 0xF738,
+ eightparen: 0x247B,
+ eightperiod: 0x248F,
+ eightpersian: 0x06F8,
+ eightroman: 0x2177,
+ eightsuperior: 0x2078,
+ eightthai: 0x0E58,
+ einvertedbreve: 0x0207,
+ eiotifiedcyrillic: 0x0465,
+ ekatakana: 0x30A8,
+ ekatakanahalfwidth: 0xFF74,
+ ekonkargurmukhi: 0x0A74,
+ ekorean: 0x3154,
+ elcyrillic: 0x043B,
+ element: 0x2208,
+ elevencircle: 0x246A,
+ elevenparen: 0x247E,
+ elevenperiod: 0x2492,
+ elevenroman: 0x217A,
+ ellipsis: 0x2026,
+ ellipsisvertical: 0x22EE,
+ emacron: 0x0113,
+ emacronacute: 0x1E17,
+ emacrongrave: 0x1E15,
+ emcyrillic: 0x043C,
+ emdash: 0x2014,
+ emdashvertical: 0xFE31,
+ emonospace: 0xFF45,
+ emphasismarkarmenian: 0x055B,
+ emptyset: 0x2205,
+ enbopomofo: 0x3123,
+ encyrillic: 0x043D,
+ endash: 0x2013,
+ endashvertical: 0xFE32,
+ endescendercyrillic: 0x04A3,
+ eng: 0x014B,
+ engbopomofo: 0x3125,
+ enghecyrillic: 0x04A5,
+ enhookcyrillic: 0x04C8,
+ enspace: 0x2002,
+ eogonek: 0x0119,
+ eokorean: 0x3153,
+ eopen: 0x025B,
+ eopenclosed: 0x029A,
+ eopenreversed: 0x025C,
+ eopenreversedclosed: 0x025E,
+ eopenreversedhook: 0x025D,
+ eparen: 0x24A0,
+ epsilon: 0x03B5,
+ epsilontonos: 0x03AD,
+ equal: 0x003D,
+ equalmonospace: 0xFF1D,
+ equalsmall: 0xFE66,
+ equalsuperior: 0x207C,
+ equivalence: 0x2261,
+ erbopomofo: 0x3126,
+ ercyrillic: 0x0440,
+ ereversed: 0x0258,
+ ereversedcyrillic: 0x044D,
+ escyrillic: 0x0441,
+ esdescendercyrillic: 0x04AB,
+ esh: 0x0283,
+ eshcurl: 0x0286,
+ eshortdeva: 0x090E,
+ eshortvowelsigndeva: 0x0946,
+ eshreversedloop: 0x01AA,
+ eshsquatreversed: 0x0285,
+ esmallhiragana: 0x3047,
+ esmallkatakana: 0x30A7,
+ esmallkatakanahalfwidth: 0xFF6A,
+ estimated: 0x212E,
+ esuperior: 0xF6EC,
+ eta: 0x03B7,
+ etarmenian: 0x0568,
+ etatonos: 0x03AE,
+ eth: 0x00F0,
+ etilde: 0x1EBD,
+ etildebelow: 0x1E1B,
+ etnahtafoukhhebrew: 0x0591,
+ etnahtafoukhlefthebrew: 0x0591,
+ etnahtahebrew: 0x0591,
+ etnahtalefthebrew: 0x0591,
+ eturned: 0x01DD,
+ eukorean: 0x3161,
+ euro: 0x20AC,
+ evowelsignbengali: 0x09C7,
+ evowelsigndeva: 0x0947,
+ evowelsigngujarati: 0x0AC7,
+ exclam: 0x0021,
+ exclamarmenian: 0x055C,
+ exclamdbl: 0x203C,
+ exclamdown: 0x00A1,
+ exclamdownsmall: 0xF7A1,
+ exclammonospace: 0xFF01,
+ exclamsmall: 0xF721,
+ existential: 0x2203,
+ ezh: 0x0292,
+ ezhcaron: 0x01EF,
+ ezhcurl: 0x0293,
+ ezhreversed: 0x01B9,
+ ezhtail: 0x01BA,
+ f: 0x0066,
+ fadeva: 0x095E,
+ fagurmukhi: 0x0A5E,
+ fahrenheit: 0x2109,
+ fathaarabic: 0x064E,
+ fathalowarabic: 0x064E,
+ fathatanarabic: 0x064B,
+ fbopomofo: 0x3108,
+ fcircle: 0x24D5,
+ fdotaccent: 0x1E1F,
+ feharabic: 0x0641,
+ feharmenian: 0x0586,
+ fehfinalarabic: 0xFED2,
+ fehinitialarabic: 0xFED3,
+ fehmedialarabic: 0xFED4,
+ feicoptic: 0x03E5,
+ female: 0x2640,
+ ff: 0xFB00,
+ ffi: 0xFB03,
+ ffl: 0xFB04,
+ fi: 0xFB01,
+ fifteencircle: 0x246E,
+ fifteenparen: 0x2482,
+ fifteenperiod: 0x2496,
+ figuredash: 0x2012,
+ filledbox: 0x25A0,
+ filledrect: 0x25AC,
+ finalkaf: 0x05DA,
+ finalkafdagesh: 0xFB3A,
+ finalkafdageshhebrew: 0xFB3A,
+ finalkafhebrew: 0x05DA,
+ finalkafqamats: 0x05DA05B8,
+ finalkafqamatshebrew: 0x05DA05B8,
+ finalkafsheva: 0x05DA05B0,
+ finalkafshevahebrew: 0x05DA05B0,
+ finalmem: 0x05DD,
+ finalmemhebrew: 0x05DD,
+ finalnun: 0x05DF,
+ finalnunhebrew: 0x05DF,
+ finalpe: 0x05E3,
+ finalpehebrew: 0x05E3,
+ finaltsadi: 0x05E5,
+ finaltsadihebrew: 0x05E5,
+ firsttonechinese: 0x02C9,
+ fisheye: 0x25C9,
+ fitacyrillic: 0x0473,
+ five: 0x0035,
+ fivearabic: 0x0665,
+ fivebengali: 0x09EB,
+ fivecircle: 0x2464,
+ fivecircleinversesansserif: 0x278E,
+ fivedeva: 0x096B,
+ fiveeighths: 0x215D,
+ fivegujarati: 0x0AEB,
+ fivegurmukhi: 0x0A6B,
+ fivehackarabic: 0x0665,
+ fivehangzhou: 0x3025,
+ fiveideographicparen: 0x3224,
+ fiveinferior: 0x2085,
+ fivemonospace: 0xFF15,
+ fiveoldstyle: 0xF735,
+ fiveparen: 0x2478,
+ fiveperiod: 0x248C,
+ fivepersian: 0x06F5,
+ fiveroman: 0x2174,
+ fivesuperior: 0x2075,
+ fivethai: 0x0E55,
+ fl: 0xFB02,
+ florin: 0x0192,
+ fmonospace: 0xFF46,
+ fmsquare: 0x3399,
+ fofanthai: 0x0E1F,
+ fofathai: 0x0E1D,
+ fongmanthai: 0x0E4F,
+ forall: 0x2200,
+ four: 0x0034,
+ fourarabic: 0x0664,
+ fourbengali: 0x09EA,
+ fourcircle: 0x2463,
+ fourcircleinversesansserif: 0x278D,
+ fourdeva: 0x096A,
+ fourgujarati: 0x0AEA,
+ fourgurmukhi: 0x0A6A,
+ fourhackarabic: 0x0664,
+ fourhangzhou: 0x3024,
+ fourideographicparen: 0x3223,
+ fourinferior: 0x2084,
+ fourmonospace: 0xFF14,
+ fournumeratorbengali: 0x09F7,
+ fouroldstyle: 0xF734,
+ fourparen: 0x2477,
+ fourperiod: 0x248B,
+ fourpersian: 0x06F4,
+ fourroman: 0x2173,
+ foursuperior: 0x2074,
+ fourteencircle: 0x246D,
+ fourteenparen: 0x2481,
+ fourteenperiod: 0x2495,
+ fourthai: 0x0E54,
+ fourthtonechinese: 0x02CB,
+ fparen: 0x24A1,
+ fraction: 0x2044,
+ franc: 0x20A3,
+ g: 0x0067,
+ gabengali: 0x0997,
+ gacute: 0x01F5,
+ gadeva: 0x0917,
+ gafarabic: 0x06AF,
+ gaffinalarabic: 0xFB93,
+ gafinitialarabic: 0xFB94,
+ gafmedialarabic: 0xFB95,
+ gagujarati: 0x0A97,
+ gagurmukhi: 0x0A17,
+ gahiragana: 0x304C,
+ gakatakana: 0x30AC,
+ gamma: 0x03B3,
+ gammalatinsmall: 0x0263,
+ gammasuperior: 0x02E0,
+ gangiacoptic: 0x03EB,
+ gbopomofo: 0x310D,
+ gbreve: 0x011F,
+ gcaron: 0x01E7,
+ gcedilla: 0x0123,
+ gcircle: 0x24D6,
+ gcircumflex: 0x011D,
+ gcommaaccent: 0x0123,
+ gdot: 0x0121,
+ gdotaccent: 0x0121,
+ gecyrillic: 0x0433,
+ gehiragana: 0x3052,
+ gekatakana: 0x30B2,
+ geometricallyequal: 0x2251,
+ gereshaccenthebrew: 0x059C,
+ gereshhebrew: 0x05F3,
+ gereshmuqdamhebrew: 0x059D,
+ germandbls: 0x00DF,
+ gershayimaccenthebrew: 0x059E,
+ gershayimhebrew: 0x05F4,
+ getamark: 0x3013,
+ ghabengali: 0x0998,
+ ghadarmenian: 0x0572,
+ ghadeva: 0x0918,
+ ghagujarati: 0x0A98,
+ ghagurmukhi: 0x0A18,
+ ghainarabic: 0x063A,
+ ghainfinalarabic: 0xFECE,
+ ghaininitialarabic: 0xFECF,
+ ghainmedialarabic: 0xFED0,
+ ghemiddlehookcyrillic: 0x0495,
+ ghestrokecyrillic: 0x0493,
+ gheupturncyrillic: 0x0491,
+ ghhadeva: 0x095A,
+ ghhagurmukhi: 0x0A5A,
+ ghook: 0x0260,
+ ghzsquare: 0x3393,
+ gihiragana: 0x304E,
+ gikatakana: 0x30AE,
+ gimarmenian: 0x0563,
+ gimel: 0x05D2,
+ gimeldagesh: 0xFB32,
+ gimeldageshhebrew: 0xFB32,
+ gimelhebrew: 0x05D2,
+ gjecyrillic: 0x0453,
+ glottalinvertedstroke: 0x01BE,
+ glottalstop: 0x0294,
+ glottalstopinverted: 0x0296,
+ glottalstopmod: 0x02C0,
+ glottalstopreversed: 0x0295,
+ glottalstopreversedmod: 0x02C1,
+ glottalstopreversedsuperior: 0x02E4,
+ glottalstopstroke: 0x02A1,
+ glottalstopstrokereversed: 0x02A2,
+ gmacron: 0x1E21,
+ gmonospace: 0xFF47,
+ gohiragana: 0x3054,
+ gokatakana: 0x30B4,
+ gparen: 0x24A2,
+ gpasquare: 0x33AC,
+ gradient: 0x2207,
+ grave: 0x0060,
+ gravebelowcmb: 0x0316,
+ gravecmb: 0x0300,
+ gravecomb: 0x0300,
+ gravedeva: 0x0953,
+ gravelowmod: 0x02CE,
+ gravemonospace: 0xFF40,
+ gravetonecmb: 0x0340,
+ greater: 0x003E,
+ greaterequal: 0x2265,
+ greaterequalorless: 0x22DB,
+ greatermonospace: 0xFF1E,
+ greaterorequivalent: 0x2273,
+ greaterorless: 0x2277,
+ greateroverequal: 0x2267,
+ greatersmall: 0xFE65,
+ gscript: 0x0261,
+ gstroke: 0x01E5,
+ guhiragana: 0x3050,
+ guillemotleft: 0x00AB,
+ guillemotright: 0x00BB,
+ guilsinglleft: 0x2039,
+ guilsinglright: 0x203A,
+ gukatakana: 0x30B0,
+ guramusquare: 0x3318,
+ gysquare: 0x33C9,
+ h: 0x0068,
+ haabkhasiancyrillic: 0x04A9,
+ haaltonearabic: 0x06C1,
+ habengali: 0x09B9,
+ hadescendercyrillic: 0x04B3,
+ hadeva: 0x0939,
+ hagujarati: 0x0AB9,
+ hagurmukhi: 0x0A39,
+ haharabic: 0x062D,
+ hahfinalarabic: 0xFEA2,
+ hahinitialarabic: 0xFEA3,
+ hahiragana: 0x306F,
+ hahmedialarabic: 0xFEA4,
+ haitusquare: 0x332A,
+ hakatakana: 0x30CF,
+ hakatakanahalfwidth: 0xFF8A,
+ halantgurmukhi: 0x0A4D,
+ hamzaarabic: 0x0621,
+ hamzadammaarabic: 0x0621064F,
+ hamzadammatanarabic: 0x0621064C,
+ hamzafathaarabic: 0x0621064E,
+ hamzafathatanarabic: 0x0621064B,
+ hamzalowarabic: 0x0621,
+ hamzalowkasraarabic: 0x06210650,
+ hamzalowkasratanarabic: 0x0621064D,
+ hamzasukunarabic: 0x06210652,
+ hangulfiller: 0x3164,
+ hardsigncyrillic: 0x044A,
+ harpoonleftbarbup: 0x21BC,
+ harpoonrightbarbup: 0x21C0,
+ hasquare: 0x33CA,
+ hatafpatah: 0x05B2,
+ hatafpatah16: 0x05B2,
+ hatafpatah23: 0x05B2,
+ hatafpatah2f: 0x05B2,
+ hatafpatahhebrew: 0x05B2,
+ hatafpatahnarrowhebrew: 0x05B2,
+ hatafpatahquarterhebrew: 0x05B2,
+ hatafpatahwidehebrew: 0x05B2,
+ hatafqamats: 0x05B3,
+ hatafqamats1b: 0x05B3,
+ hatafqamats28: 0x05B3,
+ hatafqamats34: 0x05B3,
+ hatafqamatshebrew: 0x05B3,
+ hatafqamatsnarrowhebrew: 0x05B3,
+ hatafqamatsquarterhebrew: 0x05B3,
+ hatafqamatswidehebrew: 0x05B3,
+ hatafsegol: 0x05B1,
+ hatafsegol17: 0x05B1,
+ hatafsegol24: 0x05B1,
+ hatafsegol30: 0x05B1,
+ hatafsegolhebrew: 0x05B1,
+ hatafsegolnarrowhebrew: 0x05B1,
+ hatafsegolquarterhebrew: 0x05B1,
+ hatafsegolwidehebrew: 0x05B1,
+ hbar: 0x0127,
+ hbopomofo: 0x310F,
+ hbrevebelow: 0x1E2B,
+ hcedilla: 0x1E29,
+ hcircle: 0x24D7,
+ hcircumflex: 0x0125,
+ hdieresis: 0x1E27,
+ hdotaccent: 0x1E23,
+ hdotbelow: 0x1E25,
+ he: 0x05D4,
+ heart: 0x2665,
+ heartsuitblack: 0x2665,
+ heartsuitwhite: 0x2661,
+ hedagesh: 0xFB34,
+ hedageshhebrew: 0xFB34,
+ hehaltonearabic: 0x06C1,
+ heharabic: 0x0647,
+ hehebrew: 0x05D4,
+ hehfinalaltonearabic: 0xFBA7,
+ hehfinalalttwoarabic: 0xFEEA,
+ hehfinalarabic: 0xFEEA,
+ hehhamzaabovefinalarabic: 0xFBA5,
+ hehhamzaaboveisolatedarabic: 0xFBA4,
+ hehinitialaltonearabic: 0xFBA8,
+ hehinitialarabic: 0xFEEB,
+ hehiragana: 0x3078,
+ hehmedialaltonearabic: 0xFBA9,
+ hehmedialarabic: 0xFEEC,
+ heiseierasquare: 0x337B,
+ hekatakana: 0x30D8,
+ hekatakanahalfwidth: 0xFF8D,
+ hekutaarusquare: 0x3336,
+ henghook: 0x0267,
+ herutusquare: 0x3339,
+ het: 0x05D7,
+ hethebrew: 0x05D7,
+ hhook: 0x0266,
+ hhooksuperior: 0x02B1,
+ hieuhacirclekorean: 0x327B,
+ hieuhaparenkorean: 0x321B,
+ hieuhcirclekorean: 0x326D,
+ hieuhkorean: 0x314E,
+ hieuhparenkorean: 0x320D,
+ hihiragana: 0x3072,
+ hikatakana: 0x30D2,
+ hikatakanahalfwidth: 0xFF8B,
+ hiriq: 0x05B4,
+ hiriq14: 0x05B4,
+ hiriq21: 0x05B4,
+ hiriq2d: 0x05B4,
+ hiriqhebrew: 0x05B4,
+ hiriqnarrowhebrew: 0x05B4,
+ hiriqquarterhebrew: 0x05B4,
+ hiriqwidehebrew: 0x05B4,
+ hlinebelow: 0x1E96,
+ hmonospace: 0xFF48,
+ hoarmenian: 0x0570,
+ hohipthai: 0x0E2B,
+ hohiragana: 0x307B,
+ hokatakana: 0x30DB,
+ hokatakanahalfwidth: 0xFF8E,
+ holam: 0x05B9,
+ holam19: 0x05B9,
+ holam26: 0x05B9,
+ holam32: 0x05B9,
+ holamhebrew: 0x05B9,
+ holamnarrowhebrew: 0x05B9,
+ holamquarterhebrew: 0x05B9,
+ holamwidehebrew: 0x05B9,
+ honokhukthai: 0x0E2E,
+ hookabovecomb: 0x0309,
+ hookcmb: 0x0309,
+ hookpalatalizedbelowcmb: 0x0321,
+ hookretroflexbelowcmb: 0x0322,
+ hoonsquare: 0x3342,
+ horicoptic: 0x03E9,
+ horizontalbar: 0x2015,
+ horncmb: 0x031B,
+ hotsprings: 0x2668,
+ house: 0x2302,
+ hparen: 0x24A3,
+ hsuperior: 0x02B0,
+ hturned: 0x0265,
+ huhiragana: 0x3075,
+ huiitosquare: 0x3333,
+ hukatakana: 0x30D5,
+ hukatakanahalfwidth: 0xFF8C,
+ hungarumlaut: 0x02DD,
+ hungarumlautcmb: 0x030B,
+ hv: 0x0195,
+ hyphen: 0x002D,
+ hypheninferior: 0xF6E5,
+ hyphenmonospace: 0xFF0D,
+ hyphensmall: 0xFE63,
+ hyphensuperior: 0xF6E6,
+ hyphentwo: 0x2010,
+ i: 0x0069,
+ iacute: 0x00ED,
+ iacyrillic: 0x044F,
+ ibengali: 0x0987,
+ ibopomofo: 0x3127,
+ ibreve: 0x012D,
+ icaron: 0x01D0,
+ icircle: 0x24D8,
+ icircumflex: 0x00EE,
+ icyrillic: 0x0456,
+ idblgrave: 0x0209,
+ ideographearthcircle: 0x328F,
+ ideographfirecircle: 0x328B,
+ ideographicallianceparen: 0x323F,
+ ideographiccallparen: 0x323A,
+ ideographiccentrecircle: 0x32A5,
+ ideographicclose: 0x3006,
+ ideographiccomma: 0x3001,
+ ideographiccommaleft: 0xFF64,
+ ideographiccongratulationparen: 0x3237,
+ ideographiccorrectcircle: 0x32A3,
+ ideographicearthparen: 0x322F,
+ ideographicenterpriseparen: 0x323D,
+ ideographicexcellentcircle: 0x329D,
+ ideographicfestivalparen: 0x3240,
+ ideographicfinancialcircle: 0x3296,
+ ideographicfinancialparen: 0x3236,
+ ideographicfireparen: 0x322B,
+ ideographichaveparen: 0x3232,
+ ideographichighcircle: 0x32A4,
+ ideographiciterationmark: 0x3005,
+ ideographiclaborcircle: 0x3298,
+ ideographiclaborparen: 0x3238,
+ ideographicleftcircle: 0x32A7,
+ ideographiclowcircle: 0x32A6,
+ ideographicmedicinecircle: 0x32A9,
+ ideographicmetalparen: 0x322E,
+ ideographicmoonparen: 0x322A,
+ ideographicnameparen: 0x3234,
+ ideographicperiod: 0x3002,
+ ideographicprintcircle: 0x329E,
+ ideographicreachparen: 0x3243,
+ ideographicrepresentparen: 0x3239,
+ ideographicresourceparen: 0x323E,
+ ideographicrightcircle: 0x32A8,
+ ideographicsecretcircle: 0x3299,
+ ideographicselfparen: 0x3242,
+ ideographicsocietyparen: 0x3233,
+ ideographicspace: 0x3000,
+ ideographicspecialparen: 0x3235,
+ ideographicstockparen: 0x3231,
+ ideographicstudyparen: 0x323B,
+ ideographicsunparen: 0x3230,
+ ideographicsuperviseparen: 0x323C,
+ ideographicwaterparen: 0x322C,
+ ideographicwoodparen: 0x322D,
+ ideographiczero: 0x3007,
+ ideographmetalcircle: 0x328E,
+ ideographmooncircle: 0x328A,
+ ideographnamecircle: 0x3294,
+ ideographsuncircle: 0x3290,
+ ideographwatercircle: 0x328C,
+ ideographwoodcircle: 0x328D,
+ ideva: 0x0907,
+ idieresis: 0x00EF,
+ idieresisacute: 0x1E2F,
+ idieresiscyrillic: 0x04E5,
+ idotbelow: 0x1ECB,
+ iebrevecyrillic: 0x04D7,
+ iecyrillic: 0x0435,
+ ieungacirclekorean: 0x3275,
+ ieungaparenkorean: 0x3215,
+ ieungcirclekorean: 0x3267,
+ ieungkorean: 0x3147,
+ ieungparenkorean: 0x3207,
+ igrave: 0x00EC,
+ igujarati: 0x0A87,
+ igurmukhi: 0x0A07,
+ ihiragana: 0x3044,
+ ihookabove: 0x1EC9,
+ iibengali: 0x0988,
+ iicyrillic: 0x0438,
+ iideva: 0x0908,
+ iigujarati: 0x0A88,
+ iigurmukhi: 0x0A08,
+ iimatragurmukhi: 0x0A40,
+ iinvertedbreve: 0x020B,
+ iishortcyrillic: 0x0439,
+ iivowelsignbengali: 0x09C0,
+ iivowelsigndeva: 0x0940,
+ iivowelsigngujarati: 0x0AC0,
+ ij: 0x0133,
+ ikatakana: 0x30A4,
+ ikatakanahalfwidth: 0xFF72,
+ ikorean: 0x3163,
+ ilde: 0x02DC,
+ iluyhebrew: 0x05AC,
+ imacron: 0x012B,
+ imacroncyrillic: 0x04E3,
+ imageorapproximatelyequal: 0x2253,
+ imatragurmukhi: 0x0A3F,
+ imonospace: 0xFF49,
+ increment: 0x2206,
+ infinity: 0x221E,
+ iniarmenian: 0x056B,
+ integral: 0x222B,
+ integralbottom: 0x2321,
+ integralbt: 0x2321,
+ integralex: 0xF8F5,
+ integraltop: 0x2320,
+ integraltp: 0x2320,
+ intersection: 0x2229,
+ intisquare: 0x3305,
+ invbullet: 0x25D8,
+ invcircle: 0x25D9,
+ invsmileface: 0x263B,
+ iocyrillic: 0x0451,
+ iogonek: 0x012F,
+ iota: 0x03B9,
+ iotadieresis: 0x03CA,
+ iotadieresistonos: 0x0390,
+ iotalatin: 0x0269,
+ iotatonos: 0x03AF,
+ iparen: 0x24A4,
+ irigurmukhi: 0x0A72,
+ ismallhiragana: 0x3043,
+ ismallkatakana: 0x30A3,
+ ismallkatakanahalfwidth: 0xFF68,
+ issharbengali: 0x09FA,
+ istroke: 0x0268,
+ isuperior: 0xF6ED,
+ iterationhiragana: 0x309D,
+ iterationkatakana: 0x30FD,
+ itilde: 0x0129,
+ itildebelow: 0x1E2D,
+ iubopomofo: 0x3129,
+ iucyrillic: 0x044E,
+ ivowelsignbengali: 0x09BF,
+ ivowelsigndeva: 0x093F,
+ ivowelsigngujarati: 0x0ABF,
+ izhitsacyrillic: 0x0475,
+ izhitsadblgravecyrillic: 0x0477,
+ j: 0x006A,
+ jaarmenian: 0x0571,
+ jabengali: 0x099C,
+ jadeva: 0x091C,
+ jagujarati: 0x0A9C,
+ jagurmukhi: 0x0A1C,
+ jbopomofo: 0x3110,
+ jcaron: 0x01F0,
+ jcircle: 0x24D9,
+ jcircumflex: 0x0135,
+ jcrossedtail: 0x029D,
+ jdotlessstroke: 0x025F,
+ jecyrillic: 0x0458,
+ jeemarabic: 0x062C,
+ jeemfinalarabic: 0xFE9E,
+ jeeminitialarabic: 0xFE9F,
+ jeemmedialarabic: 0xFEA0,
+ jeharabic: 0x0698,
+ jehfinalarabic: 0xFB8B,
+ jhabengali: 0x099D,
+ jhadeva: 0x091D,
+ jhagujarati: 0x0A9D,
+ jhagurmukhi: 0x0A1D,
+ jheharmenian: 0x057B,
+ jis: 0x3004,
+ jmonospace: 0xFF4A,
+ jparen: 0x24A5,
+ jsuperior: 0x02B2,
+ k: 0x006B,
+ kabashkircyrillic: 0x04A1,
+ kabengali: 0x0995,
+ kacute: 0x1E31,
+ kacyrillic: 0x043A,
+ kadescendercyrillic: 0x049B,
+ kadeva: 0x0915,
+ kaf: 0x05DB,
+ kafarabic: 0x0643,
+ kafdagesh: 0xFB3B,
+ kafdageshhebrew: 0xFB3B,
+ kaffinalarabic: 0xFEDA,
+ kafhebrew: 0x05DB,
+ kafinitialarabic: 0xFEDB,
+ kafmedialarabic: 0xFEDC,
+ kafrafehebrew: 0xFB4D,
+ kagujarati: 0x0A95,
+ kagurmukhi: 0x0A15,
+ kahiragana: 0x304B,
+ kahookcyrillic: 0x04C4,
+ kakatakana: 0x30AB,
+ kakatakanahalfwidth: 0xFF76,
+ kappa: 0x03BA,
+ kappasymbolgreek: 0x03F0,
+ kapyeounmieumkorean: 0x3171,
+ kapyeounphieuphkorean: 0x3184,
+ kapyeounpieupkorean: 0x3178,
+ kapyeounssangpieupkorean: 0x3179,
+ karoriisquare: 0x330D,
+ kashidaautoarabic: 0x0640,
+ kashidaautonosidebearingarabic: 0x0640,
+ kasmallkatakana: 0x30F5,
+ kasquare: 0x3384,
+ kasraarabic: 0x0650,
+ kasratanarabic: 0x064D,
+ kastrokecyrillic: 0x049F,
+ katahiraprolongmarkhalfwidth: 0xFF70,
+ kaverticalstrokecyrillic: 0x049D,
+ kbopomofo: 0x310E,
+ kcalsquare: 0x3389,
+ kcaron: 0x01E9,
+ kcedilla: 0x0137,
+ kcircle: 0x24DA,
+ kcommaaccent: 0x0137,
+ kdotbelow: 0x1E33,
+ keharmenian: 0x0584,
+ kehiragana: 0x3051,
+ kekatakana: 0x30B1,
+ kekatakanahalfwidth: 0xFF79,
+ kenarmenian: 0x056F,
+ kesmallkatakana: 0x30F6,
+ kgreenlandic: 0x0138,
+ khabengali: 0x0996,
+ khacyrillic: 0x0445,
+ khadeva: 0x0916,
+ khagujarati: 0x0A96,
+ khagurmukhi: 0x0A16,
+ khaharabic: 0x062E,
+ khahfinalarabic: 0xFEA6,
+ khahinitialarabic: 0xFEA7,
+ khahmedialarabic: 0xFEA8,
+ kheicoptic: 0x03E7,
+ khhadeva: 0x0959,
+ khhagurmukhi: 0x0A59,
+ khieukhacirclekorean: 0x3278,
+ khieukhaparenkorean: 0x3218,
+ khieukhcirclekorean: 0x326A,
+ khieukhkorean: 0x314B,
+ khieukhparenkorean: 0x320A,
+ khokhaithai: 0x0E02,
+ khokhonthai: 0x0E05,
+ khokhuatthai: 0x0E03,
+ khokhwaithai: 0x0E04,
+ khomutthai: 0x0E5B,
+ khook: 0x0199,
+ khorakhangthai: 0x0E06,
+ khzsquare: 0x3391,
+ kihiragana: 0x304D,
+ kikatakana: 0x30AD,
+ kikatakanahalfwidth: 0xFF77,
+ kiroguramusquare: 0x3315,
+ kiromeetorusquare: 0x3316,
+ kirosquare: 0x3314,
+ kiyeokacirclekorean: 0x326E,
+ kiyeokaparenkorean: 0x320E,
+ kiyeokcirclekorean: 0x3260,
+ kiyeokkorean: 0x3131,
+ kiyeokparenkorean: 0x3200,
+ kiyeoksioskorean: 0x3133,
+ kjecyrillic: 0x045C,
+ klinebelow: 0x1E35,
+ klsquare: 0x3398,
+ kmcubedsquare: 0x33A6,
+ kmonospace: 0xFF4B,
+ kmsquaredsquare: 0x33A2,
+ kohiragana: 0x3053,
+ kohmsquare: 0x33C0,
+ kokaithai: 0x0E01,
+ kokatakana: 0x30B3,
+ kokatakanahalfwidth: 0xFF7A,
+ kooposquare: 0x331E,
+ koppacyrillic: 0x0481,
+ koreanstandardsymbol: 0x327F,
+ koroniscmb: 0x0343,
+ kparen: 0x24A6,
+ kpasquare: 0x33AA,
+ ksicyrillic: 0x046F,
+ ktsquare: 0x33CF,
+ kturned: 0x029E,
+ kuhiragana: 0x304F,
+ kukatakana: 0x30AF,
+ kukatakanahalfwidth: 0xFF78,
+ kvsquare: 0x33B8,
+ kwsquare: 0x33BE,
+ l: 0x006C,
+ labengali: 0x09B2,
+ lacute: 0x013A,
+ ladeva: 0x0932,
+ lagujarati: 0x0AB2,
+ lagurmukhi: 0x0A32,
+ lakkhangyaothai: 0x0E45,
+ lamaleffinalarabic: 0xFEFC,
+ lamalefhamzaabovefinalarabic: 0xFEF8,
+ lamalefhamzaaboveisolatedarabic: 0xFEF7,
+ lamalefhamzabelowfinalarabic: 0xFEFA,
+ lamalefhamzabelowisolatedarabic: 0xFEF9,
+ lamalefisolatedarabic: 0xFEFB,
+ lamalefmaddaabovefinalarabic: 0xFEF6,
+ lamalefmaddaaboveisolatedarabic: 0xFEF5,
+ lamarabic: 0x0644,
+ lambda: 0x03BB,
+ lambdastroke: 0x019B,
+ lamed: 0x05DC,
+ lameddagesh: 0xFB3C,
+ lameddageshhebrew: 0xFB3C,
+ lamedhebrew: 0x05DC,
+ lamedholam: 0x05DC05B9,
+ lamedholamdagesh: '05DC 05B9 05BC',
+ lamedholamdageshhebrew: '05DC 05B9 05BC',
+ lamedholamhebrew: 0x05DC05B9,
+ lamfinalarabic: 0xFEDE,
+ lamhahinitialarabic: 0xFCCA,
+ laminitialarabic: 0xFEDF,
+ lamjeeminitialarabic: 0xFCC9,
+ lamkhahinitialarabic: 0xFCCB,
+ lamlamhehisolatedarabic: 0xFDF2,
+ lammedialarabic: 0xFEE0,
+ lammeemhahinitialarabic: 0xFD88,
+ lammeeminitialarabic: 0xFCCC,
+ lammeemjeeminitialarabic: 'FEDF FEE4 FEA0',
+ lammeemkhahinitialarabic: 'FEDF FEE4 FEA8',
+ largecircle: 0x25EF,
+ lbar: 0x019A,
+ lbelt: 0x026C,
+ lbopomofo: 0x310C,
+ lcaron: 0x013E,
+ lcedilla: 0x013C,
+ lcircle: 0x24DB,
+ lcircumflexbelow: 0x1E3D,
+ lcommaaccent: 0x013C,
+ ldot: 0x0140,
+ ldotaccent: 0x0140,
+ ldotbelow: 0x1E37,
+ ldotbelowmacron: 0x1E39,
+ leftangleabovecmb: 0x031A,
+ lefttackbelowcmb: 0x0318,
+ less: 0x003C,
+ lessequal: 0x2264,
+ lessequalorgreater: 0x22DA,
+ lessmonospace: 0xFF1C,
+ lessorequivalent: 0x2272,
+ lessorgreater: 0x2276,
+ lessoverequal: 0x2266,
+ lesssmall: 0xFE64,
+ lezh: 0x026E,
+ lfblock: 0x258C,
+ lhookretroflex: 0x026D,
+ lira: 0x20A4,
+ liwnarmenian: 0x056C,
+ lj: 0x01C9,
+ ljecyrillic: 0x0459,
+ ll: 0xF6C0,
+ lladeva: 0x0933,
+ llagujarati: 0x0AB3,
+ llinebelow: 0x1E3B,
+ llladeva: 0x0934,
+ llvocalicbengali: 0x09E1,
+ llvocalicdeva: 0x0961,
+ llvocalicvowelsignbengali: 0x09E3,
+ llvocalicvowelsigndeva: 0x0963,
+ lmiddletilde: 0x026B,
+ lmonospace: 0xFF4C,
+ lmsquare: 0x33D0,
+ lochulathai: 0x0E2C,
+ logicaland: 0x2227,
+ logicalnot: 0x00AC,
+ logicalnotreversed: 0x2310,
+ logicalor: 0x2228,
+ lolingthai: 0x0E25,
+ longs: 0x017F,
+ lowlinecenterline: 0xFE4E,
+ lowlinecmb: 0x0332,
+ lowlinedashed: 0xFE4D,
+ lozenge: 0x25CA,
+ lparen: 0x24A7,
+ lslash: 0x0142,
+ lsquare: 0x2113,
+ lsuperior: 0xF6EE,
+ ltshade: 0x2591,
+ luthai: 0x0E26,
+ lvocalicbengali: 0x098C,
+ lvocalicdeva: 0x090C,
+ lvocalicvowelsignbengali: 0x09E2,
+ lvocalicvowelsigndeva: 0x0962,
+ lxsquare: 0x33D3,
+ m: 0x006D,
+ mabengali: 0x09AE,
+ macron: 0x00AF,
+ macronbelowcmb: 0x0331,
+ macroncmb: 0x0304,
+ macronlowmod: 0x02CD,
+ macronmonospace: 0xFFE3,
+ macute: 0x1E3F,
+ madeva: 0x092E,
+ magujarati: 0x0AAE,
+ magurmukhi: 0x0A2E,
+ mahapakhhebrew: 0x05A4,
+ mahapakhlefthebrew: 0x05A4,
+ mahiragana: 0x307E,
+ maichattawalowleftthai: 0xF895,
+ maichattawalowrightthai: 0xF894,
+ maichattawathai: 0x0E4B,
+ maichattawaupperleftthai: 0xF893,
+ maieklowleftthai: 0xF88C,
+ maieklowrightthai: 0xF88B,
+ maiekthai: 0x0E48,
+ maiekupperleftthai: 0xF88A,
+ maihanakatleftthai: 0xF884,
+ maihanakatthai: 0x0E31,
+ maitaikhuleftthai: 0xF889,
+ maitaikhuthai: 0x0E47,
+ maitholowleftthai: 0xF88F,
+ maitholowrightthai: 0xF88E,
+ maithothai: 0x0E49,
+ maithoupperleftthai: 0xF88D,
+ maitrilowleftthai: 0xF892,
+ maitrilowrightthai: 0xF891,
+ maitrithai: 0x0E4A,
+ maitriupperleftthai: 0xF890,
+ maiyamokthai: 0x0E46,
+ makatakana: 0x30DE,
+ makatakanahalfwidth: 0xFF8F,
+ male: 0x2642,
+ mansyonsquare: 0x3347,
+ maqafhebrew: 0x05BE,
+ mars: 0x2642,
+ masoracirclehebrew: 0x05AF,
+ masquare: 0x3383,
+ mbopomofo: 0x3107,
+ mbsquare: 0x33D4,
+ mcircle: 0x24DC,
+ mcubedsquare: 0x33A5,
+ mdotaccent: 0x1E41,
+ mdotbelow: 0x1E43,
+ meemarabic: 0x0645,
+ meemfinalarabic: 0xFEE2,
+ meeminitialarabic: 0xFEE3,
+ meemmedialarabic: 0xFEE4,
+ meemmeeminitialarabic: 0xFCD1,
+ meemmeemisolatedarabic: 0xFC48,
+ meetorusquare: 0x334D,
+ mehiragana: 0x3081,
+ meizierasquare: 0x337E,
+ mekatakana: 0x30E1,
+ mekatakanahalfwidth: 0xFF92,
+ mem: 0x05DE,
+ memdagesh: 0xFB3E,
+ memdageshhebrew: 0xFB3E,
+ memhebrew: 0x05DE,
+ menarmenian: 0x0574,
+ merkhahebrew: 0x05A5,
+ merkhakefulahebrew: 0x05A6,
+ merkhakefulalefthebrew: 0x05A6,
+ merkhalefthebrew: 0x05A5,
+ mhook: 0x0271,
+ mhzsquare: 0x3392,
+ middledotkatakanahalfwidth: 0xFF65,
+ middot: 0x00B7,
+ mieumacirclekorean: 0x3272,
+ mieumaparenkorean: 0x3212,
+ mieumcirclekorean: 0x3264,
+ mieumkorean: 0x3141,
+ mieumpansioskorean: 0x3170,
+ mieumparenkorean: 0x3204,
+ mieumpieupkorean: 0x316E,
+ mieumsioskorean: 0x316F,
+ mihiragana: 0x307F,
+ mikatakana: 0x30DF,
+ mikatakanahalfwidth: 0xFF90,
+ minus: 0x2212,
+ minusbelowcmb: 0x0320,
+ minuscircle: 0x2296,
+ minusmod: 0x02D7,
+ minusplus: 0x2213,
+ minute: 0x2032,
+ miribaarusquare: 0x334A,
+ mirisquare: 0x3349,
+ mlonglegturned: 0x0270,
+ mlsquare: 0x3396,
+ mmcubedsquare: 0x33A3,
+ mmonospace: 0xFF4D,
+ mmsquaredsquare: 0x339F,
+ mohiragana: 0x3082,
+ mohmsquare: 0x33C1,
+ mokatakana: 0x30E2,
+ mokatakanahalfwidth: 0xFF93,
+ molsquare: 0x33D6,
+ momathai: 0x0E21,
+ moverssquare: 0x33A7,
+ moverssquaredsquare: 0x33A8,
+ mparen: 0x24A8,
+ mpasquare: 0x33AB,
+ mssquare: 0x33B3,
+ msuperior: 0xF6EF,
+ mturned: 0x026F,
+ mu: 0x00B5,
+ mu1: 0x00B5,
+ muasquare: 0x3382,
+ muchgreater: 0x226B,
+ muchless: 0x226A,
+ mufsquare: 0x338C,
+ mugreek: 0x03BC,
+ mugsquare: 0x338D,
+ muhiragana: 0x3080,
+ mukatakana: 0x30E0,
+ mukatakanahalfwidth: 0xFF91,
+ mulsquare: 0x3395,
+ multiply: 0x00D7,
+ mumsquare: 0x339B,
+ munahhebrew: 0x05A3,
+ munahlefthebrew: 0x05A3,
+ musicalnote: 0x266A,
+ musicalnotedbl: 0x266B,
+ musicflatsign: 0x266D,
+ musicsharpsign: 0x266F,
+ mussquare: 0x33B2,
+ muvsquare: 0x33B6,
+ muwsquare: 0x33BC,
+ mvmegasquare: 0x33B9,
+ mvsquare: 0x33B7,
+ mwmegasquare: 0x33BF,
+ mwsquare: 0x33BD,
+ n: 0x006E,
+ nabengali: 0x09A8,
+ nabla: 0x2207,
+ nacute: 0x0144,
+ nadeva: 0x0928,
+ nagujarati: 0x0AA8,
+ nagurmukhi: 0x0A28,
+ nahiragana: 0x306A,
+ nakatakana: 0x30CA,
+ nakatakanahalfwidth: 0xFF85,
+ napostrophe: 0x0149,
+ nasquare: 0x3381,
+ nbopomofo: 0x310B,
+ nbspace: 0x00A0,
+ ncaron: 0x0148,
+ ncedilla: 0x0146,
+ ncircle: 0x24DD,
+ ncircumflexbelow: 0x1E4B,
+ ncommaaccent: 0x0146,
+ ndotaccent: 0x1E45,
+ ndotbelow: 0x1E47,
+ nehiragana: 0x306D,
+ nekatakana: 0x30CD,
+ nekatakanahalfwidth: 0xFF88,
+ newsheqelsign: 0x20AA,
+ nfsquare: 0x338B,
+ ngabengali: 0x0999,
+ ngadeva: 0x0919,
+ ngagujarati: 0x0A99,
+ ngagurmukhi: 0x0A19,
+ ngonguthai: 0x0E07,
+ nhiragana: 0x3093,
+ nhookleft: 0x0272,
+ nhookretroflex: 0x0273,
+ nieunacirclekorean: 0x326F,
+ nieunaparenkorean: 0x320F,
+ nieuncieuckorean: 0x3135,
+ nieuncirclekorean: 0x3261,
+ nieunhieuhkorean: 0x3136,
+ nieunkorean: 0x3134,
+ nieunpansioskorean: 0x3168,
+ nieunparenkorean: 0x3201,
+ nieunsioskorean: 0x3167,
+ nieuntikeutkorean: 0x3166,
+ nihiragana: 0x306B,
+ nikatakana: 0x30CB,
+ nikatakanahalfwidth: 0xFF86,
+ nikhahitleftthai: 0xF899,
+ nikhahitthai: 0x0E4D,
+ nine: 0x0039,
+ ninearabic: 0x0669,
+ ninebengali: 0x09EF,
+ ninecircle: 0x2468,
+ ninecircleinversesansserif: 0x2792,
+ ninedeva: 0x096F,
+ ninegujarati: 0x0AEF,
+ ninegurmukhi: 0x0A6F,
+ ninehackarabic: 0x0669,
+ ninehangzhou: 0x3029,
+ nineideographicparen: 0x3228,
+ nineinferior: 0x2089,
+ ninemonospace: 0xFF19,
+ nineoldstyle: 0xF739,
+ nineparen: 0x247C,
+ nineperiod: 0x2490,
+ ninepersian: 0x06F9,
+ nineroman: 0x2178,
+ ninesuperior: 0x2079,
+ nineteencircle: 0x2472,
+ nineteenparen: 0x2486,
+ nineteenperiod: 0x249A,
+ ninethai: 0x0E59,
+ nj: 0x01CC,
+ njecyrillic: 0x045A,
+ nkatakana: 0x30F3,
+ nkatakanahalfwidth: 0xFF9D,
+ nlegrightlong: 0x019E,
+ nlinebelow: 0x1E49,
+ nmonospace: 0xFF4E,
+ nmsquare: 0x339A,
+ nnabengali: 0x09A3,
+ nnadeva: 0x0923,
+ nnagujarati: 0x0AA3,
+ nnagurmukhi: 0x0A23,
+ nnnadeva: 0x0929,
+ nohiragana: 0x306E,
+ nokatakana: 0x30CE,
+ nokatakanahalfwidth: 0xFF89,
+ nonbreakingspace: 0x00A0,
+ nonenthai: 0x0E13,
+ nonuthai: 0x0E19,
+ noonarabic: 0x0646,
+ noonfinalarabic: 0xFEE6,
+ noonghunnaarabic: 0x06BA,
+ noonghunnafinalarabic: 0xFB9F,
+ noonhehinitialarabic: 0xFEE7FEEC,
+ nooninitialarabic: 0xFEE7,
+ noonjeeminitialarabic: 0xFCD2,
+ noonjeemisolatedarabic: 0xFC4B,
+ noonmedialarabic: 0xFEE8,
+ noonmeeminitialarabic: 0xFCD5,
+ noonmeemisolatedarabic: 0xFC4E,
+ noonnoonfinalarabic: 0xFC8D,
+ notcontains: 0x220C,
+ notelement: 0x2209,
+ notelementof: 0x2209,
+ notequal: 0x2260,
+ notgreater: 0x226F,
+ notgreaternorequal: 0x2271,
+ notgreaternorless: 0x2279,
+ notidentical: 0x2262,
+ notless: 0x226E,
+ notlessnorequal: 0x2270,
+ notparallel: 0x2226,
+ notprecedes: 0x2280,
+ notsubset: 0x2284,
+ notsucceeds: 0x2281,
+ notsuperset: 0x2285,
+ nowarmenian: 0x0576,
+ nparen: 0x24A9,
+ nssquare: 0x33B1,
+ nsuperior: 0x207F,
+ ntilde: 0x00F1,
+ nu: 0x03BD,
+ nuhiragana: 0x306C,
+ nukatakana: 0x30CC,
+ nukatakanahalfwidth: 0xFF87,
+ nuktabengali: 0x09BC,
+ nuktadeva: 0x093C,
+ nuktagujarati: 0x0ABC,
+ nuktagurmukhi: 0x0A3C,
+ numbersign: 0x0023,
+ numbersignmonospace: 0xFF03,
+ numbersignsmall: 0xFE5F,
+ numeralsigngreek: 0x0374,
+ numeralsignlowergreek: 0x0375,
+ numero: 0x2116,
+ nun: 0x05E0,
+ nundagesh: 0xFB40,
+ nundageshhebrew: 0xFB40,
+ nunhebrew: 0x05E0,
+ nvsquare: 0x33B5,
+ nwsquare: 0x33BB,
+ nyabengali: 0x099E,
+ nyadeva: 0x091E,
+ nyagujarati: 0x0A9E,
+ nyagurmukhi: 0x0A1E,
+ o: 0x006F,
+ oacute: 0x00F3,
+ oangthai: 0x0E2D,
+ obarred: 0x0275,
+ obarredcyrillic: 0x04E9,
+ obarreddieresiscyrillic: 0x04EB,
+ obengali: 0x0993,
+ obopomofo: 0x311B,
+ obreve: 0x014F,
+ ocandradeva: 0x0911,
+ ocandragujarati: 0x0A91,
+ ocandravowelsigndeva: 0x0949,
+ ocandravowelsigngujarati: 0x0AC9,
+ ocaron: 0x01D2,
+ ocircle: 0x24DE,
+ ocircumflex: 0x00F4,
+ ocircumflexacute: 0x1ED1,
+ ocircumflexdotbelow: 0x1ED9,
+ ocircumflexgrave: 0x1ED3,
+ ocircumflexhookabove: 0x1ED5,
+ ocircumflextilde: 0x1ED7,
+ ocyrillic: 0x043E,
+ odblacute: 0x0151,
+ odblgrave: 0x020D,
+ odeva: 0x0913,
+ odieresis: 0x00F6,
+ odieresiscyrillic: 0x04E7,
+ odotbelow: 0x1ECD,
+ oe: 0x0153,
+ oekorean: 0x315A,
+ ogonek: 0x02DB,
+ ogonekcmb: 0x0328,
+ ograve: 0x00F2,
+ ogujarati: 0x0A93,
+ oharmenian: 0x0585,
+ ohiragana: 0x304A,
+ ohookabove: 0x1ECF,
+ ohorn: 0x01A1,
+ ohornacute: 0x1EDB,
+ ohorndotbelow: 0x1EE3,
+ ohorngrave: 0x1EDD,
+ ohornhookabove: 0x1EDF,
+ ohorntilde: 0x1EE1,
+ ohungarumlaut: 0x0151,
+ oi: 0x01A3,
+ oinvertedbreve: 0x020F,
+ okatakana: 0x30AA,
+ okatakanahalfwidth: 0xFF75,
+ okorean: 0x3157,
+ olehebrew: 0x05AB,
+ omacron: 0x014D,
+ omacronacute: 0x1E53,
+ omacrongrave: 0x1E51,
+ omdeva: 0x0950,
+ omega: 0x03C9,
+ omega1: 0x03D6,
+ omegacyrillic: 0x0461,
+ omegalatinclosed: 0x0277,
+ omegaroundcyrillic: 0x047B,
+ omegatitlocyrillic: 0x047D,
+ omegatonos: 0x03CE,
+ omgujarati: 0x0AD0,
+ omicron: 0x03BF,
+ omicrontonos: 0x03CC,
+ omonospace: 0xFF4F,
+ one: 0x0031,
+ onearabic: 0x0661,
+ onebengali: 0x09E7,
+ onecircle: 0x2460,
+ onecircleinversesansserif: 0x278A,
+ onedeva: 0x0967,
+ onedotenleader: 0x2024,
+ oneeighth: 0x215B,
+ onefitted: 0xF6DC,
+ onegujarati: 0x0AE7,
+ onegurmukhi: 0x0A67,
+ onehackarabic: 0x0661,
+ onehalf: 0x00BD,
+ onehangzhou: 0x3021,
+ oneideographicparen: 0x3220,
+ oneinferior: 0x2081,
+ onemonospace: 0xFF11,
+ onenumeratorbengali: 0x09F4,
+ oneoldstyle: 0xF731,
+ oneparen: 0x2474,
+ oneperiod: 0x2488,
+ onepersian: 0x06F1,
+ onequarter: 0x00BC,
+ oneroman: 0x2170,
+ onesuperior: 0x00B9,
+ onethai: 0x0E51,
+ onethird: 0x2153,
+ oogonek: 0x01EB,
+ oogonekmacron: 0x01ED,
+ oogurmukhi: 0x0A13,
+ oomatragurmukhi: 0x0A4B,
+ oopen: 0x0254,
+ oparen: 0x24AA,
+ openbullet: 0x25E6,
+ option: 0x2325,
+ ordfeminine: 0x00AA,
+ ordmasculine: 0x00BA,
+ orthogonal: 0x221F,
+ oshortdeva: 0x0912,
+ oshortvowelsigndeva: 0x094A,
+ oslash: 0x00F8,
+ oslashacute: 0x01FF,
+ osmallhiragana: 0x3049,
+ osmallkatakana: 0x30A9,
+ osmallkatakanahalfwidth: 0xFF6B,
+ ostrokeacute: 0x01FF,
+ osuperior: 0xF6F0,
+ otcyrillic: 0x047F,
+ otilde: 0x00F5,
+ otildeacute: 0x1E4D,
+ otildedieresis: 0x1E4F,
+ oubopomofo: 0x3121,
+ overline: 0x203E,
+ overlinecenterline: 0xFE4A,
+ overlinecmb: 0x0305,
+ overlinedashed: 0xFE49,
+ overlinedblwavy: 0xFE4C,
+ overlinewavy: 0xFE4B,
+ overscore: 0x00AF,
+ ovowelsignbengali: 0x09CB,
+ ovowelsigndeva: 0x094B,
+ ovowelsigngujarati: 0x0ACB,
+ p: 0x0070,
+ paampssquare: 0x3380,
+ paasentosquare: 0x332B,
+ pabengali: 0x09AA,
+ pacute: 0x1E55,
+ padeva: 0x092A,
+ pagedown: 0x21DF,
+ pageup: 0x21DE,
+ pagujarati: 0x0AAA,
+ pagurmukhi: 0x0A2A,
+ pahiragana: 0x3071,
+ paiyannoithai: 0x0E2F,
+ pakatakana: 0x30D1,
+ palatalizationcyrilliccmb: 0x0484,
+ palochkacyrillic: 0x04C0,
+ pansioskorean: 0x317F,
+ paragraph: 0x00B6,
+ parallel: 0x2225,
+ parenleft: 0x0028,
+ parenleftaltonearabic: 0xFD3E,
+ parenleftbt: 0xF8ED,
+ parenleftex: 0xF8EC,
+ parenleftinferior: 0x208D,
+ parenleftmonospace: 0xFF08,
+ parenleftsmall: 0xFE59,
+ parenleftsuperior: 0x207D,
+ parenlefttp: 0xF8EB,
+ parenleftvertical: 0xFE35,
+ parenright: 0x0029,
+ parenrightaltonearabic: 0xFD3F,
+ parenrightbt: 0xF8F8,
+ parenrightex: 0xF8F7,
+ parenrightinferior: 0x208E,
+ parenrightmonospace: 0xFF09,
+ parenrightsmall: 0xFE5A,
+ parenrightsuperior: 0x207E,
+ parenrighttp: 0xF8F6,
+ parenrightvertical: 0xFE36,
+ partialdiff: 0x2202,
+ paseqhebrew: 0x05C0,
+ pashtahebrew: 0x0599,
+ pasquare: 0x33A9,
+ patah: 0x05B7,
+ patah11: 0x05B7,
+ patah1d: 0x05B7,
+ patah2a: 0x05B7,
+ patahhebrew: 0x05B7,
+ patahnarrowhebrew: 0x05B7,
+ patahquarterhebrew: 0x05B7,
+ patahwidehebrew: 0x05B7,
+ pazerhebrew: 0x05A1,
+ pbopomofo: 0x3106,
+ pcircle: 0x24DF,
+ pdotaccent: 0x1E57,
+ pe: 0x05E4,
+ pecyrillic: 0x043F,
+ pedagesh: 0xFB44,
+ pedageshhebrew: 0xFB44,
+ peezisquare: 0x333B,
+ pefinaldageshhebrew: 0xFB43,
+ peharabic: 0x067E,
+ peharmenian: 0x057A,
+ pehebrew: 0x05E4,
+ pehfinalarabic: 0xFB57,
+ pehinitialarabic: 0xFB58,
+ pehiragana: 0x307A,
+ pehmedialarabic: 0xFB59,
+ pekatakana: 0x30DA,
+ pemiddlehookcyrillic: 0x04A7,
+ perafehebrew: 0xFB4E,
+ percent: 0x0025,
+ percentarabic: 0x066A,
+ percentmonospace: 0xFF05,
+ percentsmall: 0xFE6A,
+ period: 0x002E,
+ periodarmenian: 0x0589,
+ periodcentered: 0x00B7,
+ periodhalfwidth: 0xFF61,
+ periodinferior: 0xF6E7,
+ periodmonospace: 0xFF0E,
+ periodsmall: 0xFE52,
+ periodsuperior: 0xF6E8,
+ perispomenigreekcmb: 0x0342,
+ perpendicular: 0x22A5,
+ perthousand: 0x2030,
+ peseta: 0x20A7,
+ pfsquare: 0x338A,
+ phabengali: 0x09AB,
+ phadeva: 0x092B,
+ phagujarati: 0x0AAB,
+ phagurmukhi: 0x0A2B,
+ phi: 0x03C6,
+ phi1: 0x03D5,
+ phieuphacirclekorean: 0x327A,
+ phieuphaparenkorean: 0x321A,
+ phieuphcirclekorean: 0x326C,
+ phieuphkorean: 0x314D,
+ phieuphparenkorean: 0x320C,
+ philatin: 0x0278,
+ phinthuthai: 0x0E3A,
+ phisymbolgreek: 0x03D5,
+ phook: 0x01A5,
+ phophanthai: 0x0E1E,
+ phophungthai: 0x0E1C,
+ phosamphaothai: 0x0E20,
+ pi: 0x03C0,
+ pieupacirclekorean: 0x3273,
+ pieupaparenkorean: 0x3213,
+ pieupcieuckorean: 0x3176,
+ pieupcirclekorean: 0x3265,
+ pieupkiyeokkorean: 0x3172,
+ pieupkorean: 0x3142,
+ pieupparenkorean: 0x3205,
+ pieupsioskiyeokkorean: 0x3174,
+ pieupsioskorean: 0x3144,
+ pieupsiostikeutkorean: 0x3175,
+ pieupthieuthkorean: 0x3177,
+ pieuptikeutkorean: 0x3173,
+ pihiragana: 0x3074,
+ pikatakana: 0x30D4,
+ pisymbolgreek: 0x03D6,
+ piwrarmenian: 0x0583,
+ plus: 0x002B,
+ plusbelowcmb: 0x031F,
+ pluscircle: 0x2295,
+ plusminus: 0x00B1,
+ plusmod: 0x02D6,
+ plusmonospace: 0xFF0B,
+ plussmall: 0xFE62,
+ plussuperior: 0x207A,
+ pmonospace: 0xFF50,
+ pmsquare: 0x33D8,
+ pohiragana: 0x307D,
+ pointingindexdownwhite: 0x261F,
+ pointingindexleftwhite: 0x261C,
+ pointingindexrightwhite: 0x261E,
+ pointingindexupwhite: 0x261D,
+ pokatakana: 0x30DD,
+ poplathai: 0x0E1B,
+ postalmark: 0x3012,
+ postalmarkface: 0x3020,
+ pparen: 0x24AB,
+ precedes: 0x227A,
+ prescription: 0x211E,
+ primemod: 0x02B9,
+ primereversed: 0x2035,
+ product: 0x220F,
+ projective: 0x2305,
+ prolongedkana: 0x30FC,
+ propellor: 0x2318,
+ propersubset: 0x2282,
+ propersuperset: 0x2283,
+ proportion: 0x2237,
+ proportional: 0x221D,
+ psi: 0x03C8,
+ psicyrillic: 0x0471,
+ psilipneumatacyrilliccmb: 0x0486,
+ pssquare: 0x33B0,
+ puhiragana: 0x3077,
+ pukatakana: 0x30D7,
+ pvsquare: 0x33B4,
+ pwsquare: 0x33BA,
+ q: 0x0071,
+ qadeva: 0x0958,
+ qadmahebrew: 0x05A8,
+ qafarabic: 0x0642,
+ qaffinalarabic: 0xFED6,
+ qafinitialarabic: 0xFED7,
+ qafmedialarabic: 0xFED8,
+ qamats: 0x05B8,
+ qamats10: 0x05B8,
+ qamats1a: 0x05B8,
+ qamats1c: 0x05B8,
+ qamats27: 0x05B8,
+ qamats29: 0x05B8,
+ qamats33: 0x05B8,
+ qamatsde: 0x05B8,
+ qamatshebrew: 0x05B8,
+ qamatsnarrowhebrew: 0x05B8,
+ qamatsqatanhebrew: 0x05B8,
+ qamatsqatannarrowhebrew: 0x05B8,
+ qamatsqatanquarterhebrew: 0x05B8,
+ qamatsqatanwidehebrew: 0x05B8,
+ qamatsquarterhebrew: 0x05B8,
+ qamatswidehebrew: 0x05B8,
+ qarneyparahebrew: 0x059F,
+ qbopomofo: 0x3111,
+ qcircle: 0x24E0,
+ qhook: 0x02A0,
+ qmonospace: 0xFF51,
+ qof: 0x05E7,
+ qofdagesh: 0xFB47,
+ qofdageshhebrew: 0xFB47,
+ qofhatafpatah: 0x05E705B2,
+ qofhatafpatahhebrew: 0x05E705B2,
+ qofhatafsegol: 0x05E705B1,
+ qofhatafsegolhebrew: 0x05E705B1,
+ qofhebrew: 0x05E7,
+ qofhiriq: 0x05E705B4,
+ qofhiriqhebrew: 0x05E705B4,
+ qofholam: 0x05E705B9,
+ qofholamhebrew: 0x05E705B9,
+ qofpatah: 0x05E705B7,
+ qofpatahhebrew: 0x05E705B7,
+ qofqamats: 0x05E705B8,
+ qofqamatshebrew: 0x05E705B8,
+ qofqubuts: 0x05E705BB,
+ qofqubutshebrew: 0x05E705BB,
+ qofsegol: 0x05E705B6,
+ qofsegolhebrew: 0x05E705B6,
+ qofsheva: 0x05E705B0,
+ qofshevahebrew: 0x05E705B0,
+ qoftsere: 0x05E705B5,
+ qoftserehebrew: 0x05E705B5,
+ qparen: 0x24AC,
+ quarternote: 0x2669,
+ qubuts: 0x05BB,
+ qubuts18: 0x05BB,
+ qubuts25: 0x05BB,
+ qubuts31: 0x05BB,
+ qubutshebrew: 0x05BB,
+ qubutsnarrowhebrew: 0x05BB,
+ qubutsquarterhebrew: 0x05BB,
+ qubutswidehebrew: 0x05BB,
+ question: 0x003F,
+ questionarabic: 0x061F,
+ questionarmenian: 0x055E,
+ questiondown: 0x00BF,
+ questiondownsmall: 0xF7BF,
+ questiongreek: 0x037E,
+ questionmonospace: 0xFF1F,
+ questionsmall: 0xF73F,
+ quotedbl: 0x0022,
+ quotedblbase: 0x201E,
+ quotedblleft: 0x201C,
+ quotedblmonospace: 0xFF02,
+ quotedblprime: 0x301E,
+ quotedblprimereversed: 0x301D,
+ quotedblright: 0x201D,
+ quoteleft: 0x2018,
+ quoteleftreversed: 0x201B,
+ quotereversed: 0x201B,
+ quoteright: 0x2019,
+ quoterightn: 0x0149,
+ quotesinglbase: 0x201A,
+ quotesingle: 0x0027,
+ quotesinglemonospace: 0xFF07,
+ r: 0x0072,
+ raarmenian: 0x057C,
+ rabengali: 0x09B0,
+ racute: 0x0155,
+ radeva: 0x0930,
+ radical: 0x221A,
+ radicalex: 0xF8E5,
+ radoverssquare: 0x33AE,
+ radoverssquaredsquare: 0x33AF,
+ radsquare: 0x33AD,
+ rafe: 0x05BF,
+ rafehebrew: 0x05BF,
+ ragujarati: 0x0AB0,
+ ragurmukhi: 0x0A30,
+ rahiragana: 0x3089,
+ rakatakana: 0x30E9,
+ rakatakanahalfwidth: 0xFF97,
+ ralowerdiagonalbengali: 0x09F1,
+ ramiddlediagonalbengali: 0x09F0,
+ ramshorn: 0x0264,
+ ratio: 0x2236,
+ rbopomofo: 0x3116,
+ rcaron: 0x0159,
+ rcedilla: 0x0157,
+ rcircle: 0x24E1,
+ rcommaaccent: 0x0157,
+ rdblgrave: 0x0211,
+ rdotaccent: 0x1E59,
+ rdotbelow: 0x1E5B,
+ rdotbelowmacron: 0x1E5D,
+ referencemark: 0x203B,
+ reflexsubset: 0x2286,
+ reflexsuperset: 0x2287,
+ registered: 0x00AE,
+ registersans: 0xF8E8,
+ registerserif: 0xF6DA,
+ reharabic: 0x0631,
+ reharmenian: 0x0580,
+ rehfinalarabic: 0xFEAE,
+ rehiragana: 0x308C,
+ rehyehaleflamarabic: '0631 FEF3 FE8E 0644',
+ rekatakana: 0x30EC,
+ rekatakanahalfwidth: 0xFF9A,
+ resh: 0x05E8,
+ reshdageshhebrew: 0xFB48,
+ reshhatafpatah: 0x05E805B2,
+ reshhatafpatahhebrew: 0x05E805B2,
+ reshhatafsegol: 0x05E805B1,
+ reshhatafsegolhebrew: 0x05E805B1,
+ reshhebrew: 0x05E8,
+ reshhiriq: 0x05E805B4,
+ reshhiriqhebrew: 0x05E805B4,
+ reshholam: 0x05E805B9,
+ reshholamhebrew: 0x05E805B9,
+ reshpatah: 0x05E805B7,
+ reshpatahhebrew: 0x05E805B7,
+ reshqamats: 0x05E805B8,
+ reshqamatshebrew: 0x05E805B8,
+ reshqubuts: 0x05E805BB,
+ reshqubutshebrew: 0x05E805BB,
+ reshsegol: 0x05E805B6,
+ reshsegolhebrew: 0x05E805B6,
+ reshsheva: 0x05E805B0,
+ reshshevahebrew: 0x05E805B0,
+ reshtsere: 0x05E805B5,
+ reshtserehebrew: 0x05E805B5,
+ reversedtilde: 0x223D,
+ reviahebrew: 0x0597,
+ reviamugrashhebrew: 0x0597,
+ revlogicalnot: 0x2310,
+ rfishhook: 0x027E,
+ rfishhookreversed: 0x027F,
+ rhabengali: 0x09DD,
+ rhadeva: 0x095D,
+ rho: 0x03C1,
+ rhook: 0x027D,
+ rhookturned: 0x027B,
+ rhookturnedsuperior: 0x02B5,
+ rhosymbolgreek: 0x03F1,
+ rhotichookmod: 0x02DE,
+ rieulacirclekorean: 0x3271,
+ rieulaparenkorean: 0x3211,
+ rieulcirclekorean: 0x3263,
+ rieulhieuhkorean: 0x3140,
+ rieulkiyeokkorean: 0x313A,
+ rieulkiyeoksioskorean: 0x3169,
+ rieulkorean: 0x3139,
+ rieulmieumkorean: 0x313B,
+ rieulpansioskorean: 0x316C,
+ rieulparenkorean: 0x3203,
+ rieulphieuphkorean: 0x313F,
+ rieulpieupkorean: 0x313C,
+ rieulpieupsioskorean: 0x316B,
+ rieulsioskorean: 0x313D,
+ rieulthieuthkorean: 0x313E,
+ rieultikeutkorean: 0x316A,
+ rieulyeorinhieuhkorean: 0x316D,
+ rightangle: 0x221F,
+ righttackbelowcmb: 0x0319,
+ righttriangle: 0x22BF,
+ rihiragana: 0x308A,
+ rikatakana: 0x30EA,
+ rikatakanahalfwidth: 0xFF98,
+ ring: 0x02DA,
+ ringbelowcmb: 0x0325,
+ ringcmb: 0x030A,
+ ringhalfleft: 0x02BF,
+ ringhalfleftarmenian: 0x0559,
+ ringhalfleftbelowcmb: 0x031C,
+ ringhalfleftcentered: 0x02D3,
+ ringhalfright: 0x02BE,
+ ringhalfrightbelowcmb: 0x0339,
+ ringhalfrightcentered: 0x02D2,
+ rinvertedbreve: 0x0213,
+ rittorusquare: 0x3351,
+ rlinebelow: 0x1E5F,
+ rlongleg: 0x027C,
+ rlonglegturned: 0x027A,
+ rmonospace: 0xFF52,
+ rohiragana: 0x308D,
+ rokatakana: 0x30ED,
+ rokatakanahalfwidth: 0xFF9B,
+ roruathai: 0x0E23,
+ rparen: 0x24AD,
+ rrabengali: 0x09DC,
+ rradeva: 0x0931,
+ rragurmukhi: 0x0A5C,
+ rreharabic: 0x0691,
+ rrehfinalarabic: 0xFB8D,
+ rrvocalicbengali: 0x09E0,
+ rrvocalicdeva: 0x0960,
+ rrvocalicgujarati: 0x0AE0,
+ rrvocalicvowelsignbengali: 0x09C4,
+ rrvocalicvowelsigndeva: 0x0944,
+ rrvocalicvowelsigngujarati: 0x0AC4,
+ rsuperior: 0xF6F1,
+ rtblock: 0x2590,
+ rturned: 0x0279,
+ rturnedsuperior: 0x02B4,
+ ruhiragana: 0x308B,
+ rukatakana: 0x30EB,
+ rukatakanahalfwidth: 0xFF99,
+ rupeemarkbengali: 0x09F2,
+ rupeesignbengali: 0x09F3,
+ rupiah: 0xF6DD,
+ ruthai: 0x0E24,
+ rvocalicbengali: 0x098B,
+ rvocalicdeva: 0x090B,
+ rvocalicgujarati: 0x0A8B,
+ rvocalicvowelsignbengali: 0x09C3,
+ rvocalicvowelsigndeva: 0x0943,
+ rvocalicvowelsigngujarati: 0x0AC3,
+ s: 0x0073,
+ sabengali: 0x09B8,
+ sacute: 0x015B,
+ sacutedotaccent: 0x1E65,
+ sadarabic: 0x0635,
+ sadeva: 0x0938,
+ sadfinalarabic: 0xFEBA,
+ sadinitialarabic: 0xFEBB,
+ sadmedialarabic: 0xFEBC,
+ sagujarati: 0x0AB8,
+ sagurmukhi: 0x0A38,
+ sahiragana: 0x3055,
+ sakatakana: 0x30B5,
+ sakatakanahalfwidth: 0xFF7B,
+ sallallahoualayhewasallamarabic: 0xFDFA,
+ samekh: 0x05E1,
+ samekhdagesh: 0xFB41,
+ samekhdageshhebrew: 0xFB41,
+ samekhhebrew: 0x05E1,
+ saraaathai: 0x0E32,
+ saraaethai: 0x0E41,
+ saraaimaimalaithai: 0x0E44,
+ saraaimaimuanthai: 0x0E43,
+ saraamthai: 0x0E33,
+ saraathai: 0x0E30,
+ saraethai: 0x0E40,
+ saraiileftthai: 0xF886,
+ saraiithai: 0x0E35,
+ saraileftthai: 0xF885,
+ saraithai: 0x0E34,
+ saraothai: 0x0E42,
+ saraueeleftthai: 0xF888,
+ saraueethai: 0x0E37,
+ saraueleftthai: 0xF887,
+ sarauethai: 0x0E36,
+ sarauthai: 0x0E38,
+ sarauuthai: 0x0E39,
+ sbopomofo: 0x3119,
+ scaron: 0x0161,
+ scarondotaccent: 0x1E67,
+ scedilla: 0x015F,
+ schwa: 0x0259,
+ schwacyrillic: 0x04D9,
+ schwadieresiscyrillic: 0x04DB,
+ schwahook: 0x025A,
+ scircle: 0x24E2,
+ scircumflex: 0x015D,
+ scommaaccent: 0x0219,
+ sdotaccent: 0x1E61,
+ sdotbelow: 0x1E63,
+ sdotbelowdotaccent: 0x1E69,
+ seagullbelowcmb: 0x033C,
+ second: 0x2033,
+ secondtonechinese: 0x02CA,
+ section: 0x00A7,
+ seenarabic: 0x0633,
+ seenfinalarabic: 0xFEB2,
+ seeninitialarabic: 0xFEB3,
+ seenmedialarabic: 0xFEB4,
+ segol: 0x05B6,
+ segol13: 0x05B6,
+ segol1f: 0x05B6,
+ segol2c: 0x05B6,
+ segolhebrew: 0x05B6,
+ segolnarrowhebrew: 0x05B6,
+ segolquarterhebrew: 0x05B6,
+ segoltahebrew: 0x0592,
+ segolwidehebrew: 0x05B6,
+ seharmenian: 0x057D,
+ sehiragana: 0x305B,
+ sekatakana: 0x30BB,
+ sekatakanahalfwidth: 0xFF7E,
+ semicolon: 0x003B,
+ semicolonarabic: 0x061B,
+ semicolonmonospace: 0xFF1B,
+ semicolonsmall: 0xFE54,
+ semivoicedmarkkana: 0x309C,
+ semivoicedmarkkanahalfwidth: 0xFF9F,
+ sentisquare: 0x3322,
+ sentosquare: 0x3323,
+ seven: 0x0037,
+ sevenarabic: 0x0667,
+ sevenbengali: 0x09ED,
+ sevencircle: 0x2466,
+ sevencircleinversesansserif: 0x2790,
+ sevendeva: 0x096D,
+ seveneighths: 0x215E,
+ sevengujarati: 0x0AED,
+ sevengurmukhi: 0x0A6D,
+ sevenhackarabic: 0x0667,
+ sevenhangzhou: 0x3027,
+ sevenideographicparen: 0x3226,
+ seveninferior: 0x2087,
+ sevenmonospace: 0xFF17,
+ sevenoldstyle: 0xF737,
+ sevenparen: 0x247A,
+ sevenperiod: 0x248E,
+ sevenpersian: 0x06F7,
+ sevenroman: 0x2176,
+ sevensuperior: 0x2077,
+ seventeencircle: 0x2470,
+ seventeenparen: 0x2484,
+ seventeenperiod: 0x2498,
+ seventhai: 0x0E57,
+ sfthyphen: 0x00AD,
+ shaarmenian: 0x0577,
+ shabengali: 0x09B6,
+ shacyrillic: 0x0448,
+ shaddaarabic: 0x0651,
+ shaddadammaarabic: 0xFC61,
+ shaddadammatanarabic: 0xFC5E,
+ shaddafathaarabic: 0xFC60,
+ shaddafathatanarabic: 0x0651064B,
+ shaddakasraarabic: 0xFC62,
+ shaddakasratanarabic: 0xFC5F,
+ shade: 0x2592,
+ shadedark: 0x2593,
+ shadelight: 0x2591,
+ shademedium: 0x2592,
+ shadeva: 0x0936,
+ shagujarati: 0x0AB6,
+ shagurmukhi: 0x0A36,
+ shalshelethebrew: 0x0593,
+ shbopomofo: 0x3115,
+ shchacyrillic: 0x0449,
+ sheenarabic: 0x0634,
+ sheenfinalarabic: 0xFEB6,
+ sheeninitialarabic: 0xFEB7,
+ sheenmedialarabic: 0xFEB8,
+ sheicoptic: 0x03E3,
+ sheqel: 0x20AA,
+ sheqelhebrew: 0x20AA,
+ sheva: 0x05B0,
+ sheva115: 0x05B0,
+ sheva15: 0x05B0,
+ sheva22: 0x05B0,
+ sheva2e: 0x05B0,
+ shevahebrew: 0x05B0,
+ shevanarrowhebrew: 0x05B0,
+ shevaquarterhebrew: 0x05B0,
+ shevawidehebrew: 0x05B0,
+ shhacyrillic: 0x04BB,
+ shimacoptic: 0x03ED,
+ shin: 0x05E9,
+ shindagesh: 0xFB49,
+ shindageshhebrew: 0xFB49,
+ shindageshshindot: 0xFB2C,
+ shindageshshindothebrew: 0xFB2C,
+ shindageshsindot: 0xFB2D,
+ shindageshsindothebrew: 0xFB2D,
+ shindothebrew: 0x05C1,
+ shinhebrew: 0x05E9,
+ shinshindot: 0xFB2A,
+ shinshindothebrew: 0xFB2A,
+ shinsindot: 0xFB2B,
+ shinsindothebrew: 0xFB2B,
+ shook: 0x0282,
+ sigma: 0x03C3,
+ sigma1: 0x03C2,
+ sigmafinal: 0x03C2,
+ sigmalunatesymbolgreek: 0x03F2,
+ sihiragana: 0x3057,
+ sikatakana: 0x30B7,
+ sikatakanahalfwidth: 0xFF7C,
+ siluqhebrew: 0x05BD,
+ siluqlefthebrew: 0x05BD,
+ similar: 0x223C,
+ sindothebrew: 0x05C2,
+ siosacirclekorean: 0x3274,
+ siosaparenkorean: 0x3214,
+ sioscieuckorean: 0x317E,
+ sioscirclekorean: 0x3266,
+ sioskiyeokkorean: 0x317A,
+ sioskorean: 0x3145,
+ siosnieunkorean: 0x317B,
+ siosparenkorean: 0x3206,
+ siospieupkorean: 0x317D,
+ siostikeutkorean: 0x317C,
+ six: 0x0036,
+ sixarabic: 0x0666,
+ sixbengali: 0x09EC,
+ sixcircle: 0x2465,
+ sixcircleinversesansserif: 0x278F,
+ sixdeva: 0x096C,
+ sixgujarati: 0x0AEC,
+ sixgurmukhi: 0x0A6C,
+ sixhackarabic: 0x0666,
+ sixhangzhou: 0x3026,
+ sixideographicparen: 0x3225,
+ sixinferior: 0x2086,
+ sixmonospace: 0xFF16,
+ sixoldstyle: 0xF736,
+ sixparen: 0x2479,
+ sixperiod: 0x248D,
+ sixpersian: 0x06F6,
+ sixroman: 0x2175,
+ sixsuperior: 0x2076,
+ sixteencircle: 0x246F,
+ sixteencurrencydenominatorbengali: 0x09F9,
+ sixteenparen: 0x2483,
+ sixteenperiod: 0x2497,
+ sixthai: 0x0E56,
+ slash: 0x002F,
+ slashmonospace: 0xFF0F,
+ slong: 0x017F,
+ slongdotaccent: 0x1E9B,
+ smileface: 0x263A,
+ smonospace: 0xFF53,
+ sofpasuqhebrew: 0x05C3,
+ softhyphen: 0x00AD,
+ softsigncyrillic: 0x044C,
+ sohiragana: 0x305D,
+ sokatakana: 0x30BD,
+ sokatakanahalfwidth: 0xFF7F,
+ soliduslongoverlaycmb: 0x0338,
+ solidusshortoverlaycmb: 0x0337,
+ sorusithai: 0x0E29,
+ sosalathai: 0x0E28,
+ sosothai: 0x0E0B,
+ sosuathai: 0x0E2A,
+ space: 0x0020,
+ spacehackarabic: 0x0020,
+ spade: 0x2660,
+ spadesuitblack: 0x2660,
+ spadesuitwhite: 0x2664,
+ sparen: 0x24AE,
+ squarebelowcmb: 0x033B,
+ squarecc: 0x33C4,
+ squarecm: 0x339D,
+ squarediagonalcrosshatchfill: 0x25A9,
+ squarehorizontalfill: 0x25A4,
+ squarekg: 0x338F,
+ squarekm: 0x339E,
+ squarekmcapital: 0x33CE,
+ squareln: 0x33D1,
+ squarelog: 0x33D2,
+ squaremg: 0x338E,
+ squaremil: 0x33D5,
+ squaremm: 0x339C,
+ squaremsquared: 0x33A1,
+ squareorthogonalcrosshatchfill: 0x25A6,
+ squareupperlefttolowerrightfill: 0x25A7,
+ squareupperrighttolowerleftfill: 0x25A8,
+ squareverticalfill: 0x25A5,
+ squarewhitewithsmallblack: 0x25A3,
+ srsquare: 0x33DB,
+ ssabengali: 0x09B7,
+ ssadeva: 0x0937,
+ ssagujarati: 0x0AB7,
+ ssangcieuckorean: 0x3149,
+ ssanghieuhkorean: 0x3185,
+ ssangieungkorean: 0x3180,
+ ssangkiyeokkorean: 0x3132,
+ ssangnieunkorean: 0x3165,
+ ssangpieupkorean: 0x3143,
+ ssangsioskorean: 0x3146,
+ ssangtikeutkorean: 0x3138,
+ ssuperior: 0xF6F2,
+ sterling: 0x00A3,
+ sterlingmonospace: 0xFFE1,
+ strokelongoverlaycmb: 0x0336,
+ strokeshortoverlaycmb: 0x0335,
+ subset: 0x2282,
+ subsetnotequal: 0x228A,
+ subsetorequal: 0x2286,
+ succeeds: 0x227B,
+ suchthat: 0x220B,
+ suhiragana: 0x3059,
+ sukatakana: 0x30B9,
+ sukatakanahalfwidth: 0xFF7D,
+ sukunarabic: 0x0652,
+ summation: 0x2211,
+ sun: 0x263C,
+ superset: 0x2283,
+ supersetnotequal: 0x228B,
+ supersetorequal: 0x2287,
+ svsquare: 0x33DC,
+ syouwaerasquare: 0x337C,
+ t: 0x0074,
+ tabengali: 0x09A4,
+ tackdown: 0x22A4,
+ tackleft: 0x22A3,
+ tadeva: 0x0924,
+ tagujarati: 0x0AA4,
+ tagurmukhi: 0x0A24,
+ taharabic: 0x0637,
+ tahfinalarabic: 0xFEC2,
+ tahinitialarabic: 0xFEC3,
+ tahiragana: 0x305F,
+ tahmedialarabic: 0xFEC4,
+ taisyouerasquare: 0x337D,
+ takatakana: 0x30BF,
+ takatakanahalfwidth: 0xFF80,
+ tatweelarabic: 0x0640,
+ tau: 0x03C4,
+ tav: 0x05EA,
+ tavdages: 0xFB4A,
+ tavdagesh: 0xFB4A,
+ tavdageshhebrew: 0xFB4A,
+ tavhebrew: 0x05EA,
+ tbar: 0x0167,
+ tbopomofo: 0x310A,
+ tcaron: 0x0165,
+ tccurl: 0x02A8,
+ tcedilla: 0x0163,
+ tcheharabic: 0x0686,
+ tchehfinalarabic: 0xFB7B,
+ tchehinitialarabic: 0xFB7C,
+ tchehmedialarabic: 0xFB7D,
+ tchehmeeminitialarabic: 0xFB7CFEE4,
+ tcircle: 0x24E3,
+ tcircumflexbelow: 0x1E71,
+ tcommaaccent: 0x0163,
+ tdieresis: 0x1E97,
+ tdotaccent: 0x1E6B,
+ tdotbelow: 0x1E6D,
+ tecyrillic: 0x0442,
+ tedescendercyrillic: 0x04AD,
+ teharabic: 0x062A,
+ tehfinalarabic: 0xFE96,
+ tehhahinitialarabic: 0xFCA2,
+ tehhahisolatedarabic: 0xFC0C,
+ tehinitialarabic: 0xFE97,
+ tehiragana: 0x3066,
+ tehjeeminitialarabic: 0xFCA1,
+ tehjeemisolatedarabic: 0xFC0B,
+ tehmarbutaarabic: 0x0629,
+ tehmarbutafinalarabic: 0xFE94,
+ tehmedialarabic: 0xFE98,
+ tehmeeminitialarabic: 0xFCA4,
+ tehmeemisolatedarabic: 0xFC0E,
+ tehnoonfinalarabic: 0xFC73,
+ tekatakana: 0x30C6,
+ tekatakanahalfwidth: 0xFF83,
+ telephone: 0x2121,
+ telephoneblack: 0x260E,
+ telishagedolahebrew: 0x05A0,
+ telishaqetanahebrew: 0x05A9,
+ tencircle: 0x2469,
+ tenideographicparen: 0x3229,
+ tenparen: 0x247D,
+ tenperiod: 0x2491,
+ tenroman: 0x2179,
+ tesh: 0x02A7,
+ tet: 0x05D8,
+ tetdagesh: 0xFB38,
+ tetdageshhebrew: 0xFB38,
+ tethebrew: 0x05D8,
+ tetsecyrillic: 0x04B5,
+ tevirhebrew: 0x059B,
+ tevirlefthebrew: 0x059B,
+ thabengali: 0x09A5,
+ thadeva: 0x0925,
+ thagujarati: 0x0AA5,
+ thagurmukhi: 0x0A25,
+ thalarabic: 0x0630,
+ thalfinalarabic: 0xFEAC,
+ thanthakhatlowleftthai: 0xF898,
+ thanthakhatlowrightthai: 0xF897,
+ thanthakhatthai: 0x0E4C,
+ thanthakhatupperleftthai: 0xF896,
+ theharabic: 0x062B,
+ thehfinalarabic: 0xFE9A,
+ thehinitialarabic: 0xFE9B,
+ thehmedialarabic: 0xFE9C,
+ thereexists: 0x2203,
+ therefore: 0x2234,
+ theta: 0x03B8,
+ theta1: 0x03D1,
+ thetasymbolgreek: 0x03D1,
+ thieuthacirclekorean: 0x3279,
+ thieuthaparenkorean: 0x3219,
+ thieuthcirclekorean: 0x326B,
+ thieuthkorean: 0x314C,
+ thieuthparenkorean: 0x320B,
+ thirteencircle: 0x246C,
+ thirteenparen: 0x2480,
+ thirteenperiod: 0x2494,
+ thonangmonthothai: 0x0E11,
+ thook: 0x01AD,
+ thophuthaothai: 0x0E12,
+ thorn: 0x00FE,
+ thothahanthai: 0x0E17,
+ thothanthai: 0x0E10,
+ thothongthai: 0x0E18,
+ thothungthai: 0x0E16,
+ thousandcyrillic: 0x0482,
+ thousandsseparatorarabic: 0x066C,
+ thousandsseparatorpersian: 0x066C,
+ three: 0x0033,
+ threearabic: 0x0663,
+ threebengali: 0x09E9,
+ threecircle: 0x2462,
+ threecircleinversesansserif: 0x278C,
+ threedeva: 0x0969,
+ threeeighths: 0x215C,
+ threegujarati: 0x0AE9,
+ threegurmukhi: 0x0A69,
+ threehackarabic: 0x0663,
+ threehangzhou: 0x3023,
+ threeideographicparen: 0x3222,
+ threeinferior: 0x2083,
+ threemonospace: 0xFF13,
+ threenumeratorbengali: 0x09F6,
+ threeoldstyle: 0xF733,
+ threeparen: 0x2476,
+ threeperiod: 0x248A,
+ threepersian: 0x06F3,
+ threequarters: 0x00BE,
+ threequartersemdash: 0xF6DE,
+ threeroman: 0x2172,
+ threesuperior: 0x00B3,
+ threethai: 0x0E53,
+ thzsquare: 0x3394,
+ tihiragana: 0x3061,
+ tikatakana: 0x30C1,
+ tikatakanahalfwidth: 0xFF81,
+ tikeutacirclekorean: 0x3270,
+ tikeutaparenkorean: 0x3210,
+ tikeutcirclekorean: 0x3262,
+ tikeutkorean: 0x3137,
+ tikeutparenkorean: 0x3202,
+ tilde: 0x02DC,
+ tildebelowcmb: 0x0330,
+ tildecmb: 0x0303,
+ tildecomb: 0x0303,
+ tildedoublecmb: 0x0360,
+ tildeoperator: 0x223C,
+ tildeoverlaycmb: 0x0334,
+ tildeverticalcmb: 0x033E,
+ timescircle: 0x2297,
+ tipehahebrew: 0x0596,
+ tipehalefthebrew: 0x0596,
+ tippigurmukhi: 0x0A70,
+ titlocyrilliccmb: 0x0483,
+ tiwnarmenian: 0x057F,
+ tlinebelow: 0x1E6F,
+ tmonospace: 0xFF54,
+ toarmenian: 0x0569,
+ tohiragana: 0x3068,
+ tokatakana: 0x30C8,
+ tokatakanahalfwidth: 0xFF84,
+ tonebarextrahighmod: 0x02E5,
+ tonebarextralowmod: 0x02E9,
+ tonebarhighmod: 0x02E6,
+ tonebarlowmod: 0x02E8,
+ tonebarmidmod: 0x02E7,
+ tonefive: 0x01BD,
+ tonesix: 0x0185,
+ tonetwo: 0x01A8,
+ tonos: 0x0384,
+ tonsquare: 0x3327,
+ topatakthai: 0x0E0F,
+ tortoiseshellbracketleft: 0x3014,
+ tortoiseshellbracketleftsmall: 0xFE5D,
+ tortoiseshellbracketleftvertical: 0xFE39,
+ tortoiseshellbracketright: 0x3015,
+ tortoiseshellbracketrightsmall: 0xFE5E,
+ tortoiseshellbracketrightvertical: 0xFE3A,
+ totaothai: 0x0E15,
+ tpalatalhook: 0x01AB,
+ tparen: 0x24AF,
+ trademark: 0x2122,
+ trademarksans: 0xF8EA,
+ trademarkserif: 0xF6DB,
+ tretroflexhook: 0x0288,
+ triagdn: 0x25BC,
+ triaglf: 0x25C4,
+ triagrt: 0x25BA,
+ triagup: 0x25B2,
+ ts: 0x02A6,
+ tsadi: 0x05E6,
+ tsadidagesh: 0xFB46,
+ tsadidageshhebrew: 0xFB46,
+ tsadihebrew: 0x05E6,
+ tsecyrillic: 0x0446,
+ tsere: 0x05B5,
+ tsere12: 0x05B5,
+ tsere1e: 0x05B5,
+ tsere2b: 0x05B5,
+ tserehebrew: 0x05B5,
+ tserenarrowhebrew: 0x05B5,
+ tserequarterhebrew: 0x05B5,
+ tserewidehebrew: 0x05B5,
+ tshecyrillic: 0x045B,
+ tsuperior: 0xF6F3,
+ ttabengali: 0x099F,
+ ttadeva: 0x091F,
+ ttagujarati: 0x0A9F,
+ ttagurmukhi: 0x0A1F,
+ tteharabic: 0x0679,
+ ttehfinalarabic: 0xFB67,
+ ttehinitialarabic: 0xFB68,
+ ttehmedialarabic: 0xFB69,
+ tthabengali: 0x09A0,
+ tthadeva: 0x0920,
+ tthagujarati: 0x0AA0,
+ tthagurmukhi: 0x0A20,
+ tturned: 0x0287,
+ tuhiragana: 0x3064,
+ tukatakana: 0x30C4,
+ tukatakanahalfwidth: 0xFF82,
+ tusmallhiragana: 0x3063,
+ tusmallkatakana: 0x30C3,
+ tusmallkatakanahalfwidth: 0xFF6F,
+ twelvecircle: 0x246B,
+ twelveparen: 0x247F,
+ twelveperiod: 0x2493,
+ twelveroman: 0x217B,
+ twentycircle: 0x2473,
+ twentyhangzhou: 0x5344,
+ twentyparen: 0x2487,
+ twentyperiod: 0x249B,
+ two: 0x0032,
+ twoarabic: 0x0662,
+ twobengali: 0x09E8,
+ twocircle: 0x2461,
+ twocircleinversesansserif: 0x278B,
+ twodeva: 0x0968,
+ twodotenleader: 0x2025,
+ twodotleader: 0x2025,
+ twodotleadervertical: 0xFE30,
+ twogujarati: 0x0AE8,
+ twogurmukhi: 0x0A68,
+ twohackarabic: 0x0662,
+ twohangzhou: 0x3022,
+ twoideographicparen: 0x3221,
+ twoinferior: 0x2082,
+ twomonospace: 0xFF12,
+ twonumeratorbengali: 0x09F5,
+ twooldstyle: 0xF732,
+ twoparen: 0x2475,
+ twoperiod: 0x2489,
+ twopersian: 0x06F2,
+ tworoman: 0x2171,
+ twostroke: 0x01BB,
+ twosuperior: 0x00B2,
+ twothai: 0x0E52,
+ twothirds: 0x2154,
+ u: 0x0075,
+ uacute: 0x00FA,
+ ubar: 0x0289,
+ ubengali: 0x0989,
+ ubopomofo: 0x3128,
+ ubreve: 0x016D,
+ ucaron: 0x01D4,
+ ucircle: 0x24E4,
+ ucircumflex: 0x00FB,
+ ucircumflexbelow: 0x1E77,
+ ucyrillic: 0x0443,
+ udattadeva: 0x0951,
+ udblacute: 0x0171,
+ udblgrave: 0x0215,
+ udeva: 0x0909,
+ udieresis: 0x00FC,
+ udieresisacute: 0x01D8,
+ udieresisbelow: 0x1E73,
+ udieresiscaron: 0x01DA,
+ udieresiscyrillic: 0x04F1,
+ udieresisgrave: 0x01DC,
+ udieresismacron: 0x01D6,
+ udotbelow: 0x1EE5,
+ ugrave: 0x00F9,
+ ugujarati: 0x0A89,
+ ugurmukhi: 0x0A09,
+ uhiragana: 0x3046,
+ uhookabove: 0x1EE7,
+ uhorn: 0x01B0,
+ uhornacute: 0x1EE9,
+ uhorndotbelow: 0x1EF1,
+ uhorngrave: 0x1EEB,
+ uhornhookabove: 0x1EED,
+ uhorntilde: 0x1EEF,
+ uhungarumlaut: 0x0171,
+ uhungarumlautcyrillic: 0x04F3,
+ uinvertedbreve: 0x0217,
+ ukatakana: 0x30A6,
+ ukatakanahalfwidth: 0xFF73,
+ ukcyrillic: 0x0479,
+ ukorean: 0x315C,
+ umacron: 0x016B,
+ umacroncyrillic: 0x04EF,
+ umacrondieresis: 0x1E7B,
+ umatragurmukhi: 0x0A41,
+ umonospace: 0xFF55,
+ underscore: 0x005F,
+ underscoredbl: 0x2017,
+ underscoremonospace: 0xFF3F,
+ underscorevertical: 0xFE33,
+ underscorewavy: 0xFE4F,
+ union: 0x222A,
+ universal: 0x2200,
+ uogonek: 0x0173,
+ uparen: 0x24B0,
+ upblock: 0x2580,
+ upperdothebrew: 0x05C4,
+ upsilon: 0x03C5,
+ upsilondieresis: 0x03CB,
+ upsilondieresistonos: 0x03B0,
+ upsilonlatin: 0x028A,
+ upsilontonos: 0x03CD,
+ uptackbelowcmb: 0x031D,
+ uptackmod: 0x02D4,
+ uragurmukhi: 0x0A73,
+ uring: 0x016F,
+ ushortcyrillic: 0x045E,
+ usmallhiragana: 0x3045,
+ usmallkatakana: 0x30A5,
+ usmallkatakanahalfwidth: 0xFF69,
+ ustraightcyrillic: 0x04AF,
+ ustraightstrokecyrillic: 0x04B1,
+ utilde: 0x0169,
+ utildeacute: 0x1E79,
+ utildebelow: 0x1E75,
+ uubengali: 0x098A,
+ uudeva: 0x090A,
+ uugujarati: 0x0A8A,
+ uugurmukhi: 0x0A0A,
+ uumatragurmukhi: 0x0A42,
+ uuvowelsignbengali: 0x09C2,
+ uuvowelsigndeva: 0x0942,
+ uuvowelsigngujarati: 0x0AC2,
+ uvowelsignbengali: 0x09C1,
+ uvowelsigndeva: 0x0941,
+ uvowelsigngujarati: 0x0AC1,
+ v: 0x0076,
+ vadeva: 0x0935,
+ vagujarati: 0x0AB5,
+ vagurmukhi: 0x0A35,
+ vakatakana: 0x30F7,
+ vav: 0x05D5,
+ vavdagesh: 0xFB35,
+ vavdagesh65: 0xFB35,
+ vavdageshhebrew: 0xFB35,
+ vavhebrew: 0x05D5,
+ vavholam: 0xFB4B,
+ vavholamhebrew: 0xFB4B,
+ vavvavhebrew: 0x05F0,
+ vavyodhebrew: 0x05F1,
+ vcircle: 0x24E5,
+ vdotbelow: 0x1E7F,
+ vecyrillic: 0x0432,
+ veharabic: 0x06A4,
+ vehfinalarabic: 0xFB6B,
+ vehinitialarabic: 0xFB6C,
+ vehmedialarabic: 0xFB6D,
+ vekatakana: 0x30F9,
+ venus: 0x2640,
+ verticalbar: 0x007C,
+ verticallineabovecmb: 0x030D,
+ verticallinebelowcmb: 0x0329,
+ verticallinelowmod: 0x02CC,
+ verticallinemod: 0x02C8,
+ vewarmenian: 0x057E,
+ vhook: 0x028B,
+ vikatakana: 0x30F8,
+ viramabengali: 0x09CD,
+ viramadeva: 0x094D,
+ viramagujarati: 0x0ACD,
+ visargabengali: 0x0983,
+ visargadeva: 0x0903,
+ visargagujarati: 0x0A83,
+ vmonospace: 0xFF56,
+ voarmenian: 0x0578,
+ voicediterationhiragana: 0x309E,
+ voicediterationkatakana: 0x30FE,
+ voicedmarkkana: 0x309B,
+ voicedmarkkanahalfwidth: 0xFF9E,
+ vokatakana: 0x30FA,
+ vparen: 0x24B1,
+ vtilde: 0x1E7D,
+ vturned: 0x028C,
+ vuhiragana: 0x3094,
+ vukatakana: 0x30F4,
+ w: 0x0077,
+ wacute: 0x1E83,
+ waekorean: 0x3159,
+ wahiragana: 0x308F,
+ wakatakana: 0x30EF,
+ wakatakanahalfwidth: 0xFF9C,
+ wakorean: 0x3158,
+ wasmallhiragana: 0x308E,
+ wasmallkatakana: 0x30EE,
+ wattosquare: 0x3357,
+ wavedash: 0x301C,
+ wavyunderscorevertical: 0xFE34,
+ wawarabic: 0x0648,
+ wawfinalarabic: 0xFEEE,
+ wawhamzaabovearabic: 0x0624,
+ wawhamzaabovefinalarabic: 0xFE86,
+ wbsquare: 0x33DD,
+ wcircle: 0x24E6,
+ wcircumflex: 0x0175,
+ wdieresis: 0x1E85,
+ wdotaccent: 0x1E87,
+ wdotbelow: 0x1E89,
+ wehiragana: 0x3091,
+ weierstrass: 0x2118,
+ wekatakana: 0x30F1,
+ wekorean: 0x315E,
+ weokorean: 0x315D,
+ wgrave: 0x1E81,
+ whitebullet: 0x25E6,
+ whitecircle: 0x25CB,
+ whitecircleinverse: 0x25D9,
+ whitecornerbracketleft: 0x300E,
+ whitecornerbracketleftvertical: 0xFE43,
+ whitecornerbracketright: 0x300F,
+ whitecornerbracketrightvertical: 0xFE44,
+ whitediamond: 0x25C7,
+ whitediamondcontainingblacksmalldiamond: 0x25C8,
+ whitedownpointingsmalltriangle: 0x25BF,
+ whitedownpointingtriangle: 0x25BD,
+ whiteleftpointingsmalltriangle: 0x25C3,
+ whiteleftpointingtriangle: 0x25C1,
+ whitelenticularbracketleft: 0x3016,
+ whitelenticularbracketright: 0x3017,
+ whiterightpointingsmalltriangle: 0x25B9,
+ whiterightpointingtriangle: 0x25B7,
+ whitesmallsquare: 0x25AB,
+ whitesmilingface: 0x263A,
+ whitesquare: 0x25A1,
+ whitestar: 0x2606,
+ whitetelephone: 0x260F,
+ whitetortoiseshellbracketleft: 0x3018,
+ whitetortoiseshellbracketright: 0x3019,
+ whiteuppointingsmalltriangle: 0x25B5,
+ whiteuppointingtriangle: 0x25B3,
+ wihiragana: 0x3090,
+ wikatakana: 0x30F0,
+ wikorean: 0x315F,
+ wmonospace: 0xFF57,
+ wohiragana: 0x3092,
+ wokatakana: 0x30F2,
+ wokatakanahalfwidth: 0xFF66,
+ won: 0x20A9,
+ wonmonospace: 0xFFE6,
+ wowaenthai: 0x0E27,
+ wparen: 0x24B2,
+ wring: 0x1E98,
+ wsuperior: 0x02B7,
+ wturned: 0x028D,
+ wynn: 0x01BF,
+ x: 0x0078,
+ xabovecmb: 0x033D,
+ xbopomofo: 0x3112,
+ xcircle: 0x24E7,
+ xdieresis: 0x1E8D,
+ xdotaccent: 0x1E8B,
+ xeharmenian: 0x056D,
+ xi: 0x03BE,
+ xmonospace: 0xFF58,
+ xparen: 0x24B3,
+ xsuperior: 0x02E3,
+ y: 0x0079,
+ yaadosquare: 0x334E,
+ yabengali: 0x09AF,
+ yacute: 0x00FD,
+ yadeva: 0x092F,
+ yaekorean: 0x3152,
+ yagujarati: 0x0AAF,
+ yagurmukhi: 0x0A2F,
+ yahiragana: 0x3084,
+ yakatakana: 0x30E4,
+ yakatakanahalfwidth: 0xFF94,
+ yakorean: 0x3151,
+ yamakkanthai: 0x0E4E,
+ yasmallhiragana: 0x3083,
+ yasmallkatakana: 0x30E3,
+ yasmallkatakanahalfwidth: 0xFF6C,
+ yatcyrillic: 0x0463,
+ ycircle: 0x24E8,
+ ycircumflex: 0x0177,
+ ydieresis: 0x00FF,
+ ydotaccent: 0x1E8F,
+ ydotbelow: 0x1EF5,
+ yeharabic: 0x064A,
+ yehbarreearabic: 0x06D2,
+ yehbarreefinalarabic: 0xFBAF,
+ yehfinalarabic: 0xFEF2,
+ yehhamzaabovearabic: 0x0626,
+ yehhamzaabovefinalarabic: 0xFE8A,
+ yehhamzaaboveinitialarabic: 0xFE8B,
+ yehhamzaabovemedialarabic: 0xFE8C,
+ yehinitialarabic: 0xFEF3,
+ yehmedialarabic: 0xFEF4,
+ yehmeeminitialarabic: 0xFCDD,
+ yehmeemisolatedarabic: 0xFC58,
+ yehnoonfinalarabic: 0xFC94,
+ yehthreedotsbelowarabic: 0x06D1,
+ yekorean: 0x3156,
+ yen: 0x00A5,
+ yenmonospace: 0xFFE5,
+ yeokorean: 0x3155,
+ yeorinhieuhkorean: 0x3186,
+ yerahbenyomohebrew: 0x05AA,
+ yerahbenyomolefthebrew: 0x05AA,
+ yericyrillic: 0x044B,
+ yerudieresiscyrillic: 0x04F9,
+ yesieungkorean: 0x3181,
+ yesieungpansioskorean: 0x3183,
+ yesieungsioskorean: 0x3182,
+ yetivhebrew: 0x059A,
+ ygrave: 0x1EF3,
+ yhook: 0x01B4,
+ yhookabove: 0x1EF7,
+ yiarmenian: 0x0575,
+ yicyrillic: 0x0457,
+ yikorean: 0x3162,
+ yinyang: 0x262F,
+ yiwnarmenian: 0x0582,
+ ymonospace: 0xFF59,
+ yod: 0x05D9,
+ yoddagesh: 0xFB39,
+ yoddageshhebrew: 0xFB39,
+ yodhebrew: 0x05D9,
+ yodyodhebrew: 0x05F2,
+ yodyodpatahhebrew: 0xFB1F,
+ yohiragana: 0x3088,
+ yoikorean: 0x3189,
+ yokatakana: 0x30E8,
+ yokatakanahalfwidth: 0xFF96,
+ yokorean: 0x315B,
+ yosmallhiragana: 0x3087,
+ yosmallkatakana: 0x30E7,
+ yosmallkatakanahalfwidth: 0xFF6E,
+ yotgreek: 0x03F3,
+ yoyaekorean: 0x3188,
+ yoyakorean: 0x3187,
+ yoyakthai: 0x0E22,
+ yoyingthai: 0x0E0D,
+ yparen: 0x24B4,
+ ypogegrammeni: 0x037A,
+ ypogegrammenigreekcmb: 0x0345,
+ yr: 0x01A6,
+ yring: 0x1E99,
+ ysuperior: 0x02B8,
+ ytilde: 0x1EF9,
+ yturned: 0x028E,
+ yuhiragana: 0x3086,
+ yuikorean: 0x318C,
+ yukatakana: 0x30E6,
+ yukatakanahalfwidth: 0xFF95,
+ yukorean: 0x3160,
+ yusbigcyrillic: 0x046B,
+ yusbigiotifiedcyrillic: 0x046D,
+ yuslittlecyrillic: 0x0467,
+ yuslittleiotifiedcyrillic: 0x0469,
+ yusmallhiragana: 0x3085,
+ yusmallkatakana: 0x30E5,
+ yusmallkatakanahalfwidth: 0xFF6D,
+ yuyekorean: 0x318B,
+ yuyeokorean: 0x318A,
+ yyabengali: 0x09DF,
+ yyadeva: 0x095F,
+ z: 0x007A,
+ zaarmenian: 0x0566,
+ zacute: 0x017A,
+ zadeva: 0x095B,
+ zagurmukhi: 0x0A5B,
+ zaharabic: 0x0638,
+ zahfinalarabic: 0xFEC6,
+ zahinitialarabic: 0xFEC7,
+ zahiragana: 0x3056,
+ zahmedialarabic: 0xFEC8,
+ zainarabic: 0x0632,
+ zainfinalarabic: 0xFEB0,
+ zakatakana: 0x30B6,
+ zaqefgadolhebrew: 0x0595,
+ zaqefqatanhebrew: 0x0594,
+ zarqahebrew: 0x0598,
+ zayin: 0x05D6,
+ zayindagesh: 0xFB36,
+ zayindageshhebrew: 0xFB36,
+ zayinhebrew: 0x05D6,
+ zbopomofo: 0x3117,
+ zcaron: 0x017E,
+ zcircle: 0x24E9,
+ zcircumflex: 0x1E91,
+ zcurl: 0x0291,
+ zdot: 0x017C,
+ zdotaccent: 0x017C,
+ zdotbelow: 0x1E93,
+ zecyrillic: 0x0437,
+ zedescendercyrillic: 0x0499,
+ zedieresiscyrillic: 0x04DF,
+ zehiragana: 0x305C,
+ zekatakana: 0x30BC,
+ zero: 0x0030,
+ zeroarabic: 0x0660,
+ zerobengali: 0x09E6,
+ zerodeva: 0x0966,
+ zerogujarati: 0x0AE6,
+ zerogurmukhi: 0x0A66,
+ zerohackarabic: 0x0660,
+ zeroinferior: 0x2080,
+ zeromonospace: 0xFF10,
+ zerooldstyle: 0xF730,
+ zeropersian: 0x06F0,
+ zerosuperior: 0x2070,
+ zerothai: 0x0E50,
+ zerowidthjoiner: 0xFEFF,
+ zerowidthnonjoiner: 0x200C,
+ zerowidthspace: 0x200B,
+ zeta: 0x03B6,
+ zhbopomofo: 0x3113,
+ zhearmenian: 0x056A,
+ zhebrevecyrillic: 0x04C2,
+ zhecyrillic: 0x0436,
+ zhedescendercyrillic: 0x0497,
+ zhedieresiscyrillic: 0x04DD,
+ zihiragana: 0x3058,
+ zikatakana: 0x30B8,
+ zinorhebrew: 0x05AE,
+ zlinebelow: 0x1E95,
+ zmonospace: 0xFF5A,
+ zohiragana: 0x305E,
+ zokatakana: 0x30BE,
+ zparen: 0x24B5,
+ zretroflexhook: 0x0290,
+ zstroke: 0x01B6,
+ zuhiragana: 0x305A,
+ zukatakana: 0x30BA
+};
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/image.js b/apps/files_pdfviewer/js/pdfjs/src/image.js
new file mode 100755
index 00000000000..17ef7b06d82
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/image.js
@@ -0,0 +1,257 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFImage = (function pdfImage() {
+ function constructor(xref, res, image, inline) {
+ this.image = image;
+ if (image.getParams) {
+ // JPX/JPEG2000 streams directly contain bits per component
+ // and color space mode information.
+ TODO('get params from actual stream');
+ // var bits = ...
+ // var colorspace = ...
+ }
+ // TODO cache rendered images?
+
+ var dict = image.dict;
+ this.width = dict.get('Width', 'W');
+ this.height = dict.get('Height', 'H');
+
+ if (this.width < 1 || this.height < 1)
+ error('Invalid image width: ' + this.width + ' or height: ' +
+ this.height);
+
+ this.interpolate = dict.get('Interpolate', 'I') || false;
+ this.imageMask = dict.get('ImageMask', 'IM') || false;
+
+ var bitsPerComponent = image.bitsPerComponent;
+ if (!bitsPerComponent) {
+ bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+ if (!bitsPerComponent) {
+ if (this.imageMask)
+ bitsPerComponent = 1;
+ else
+ error('Bits per component missing in image: ' + this.imageMask);
+ }
+ }
+ this.bpc = bitsPerComponent;
+
+ if (!this.imageMask) {
+ var colorSpace = dict.get('ColorSpace', 'CS');
+ if (!colorSpace) {
+ TODO('JPX images (which don"t require color spaces');
+ colorSpace = new Name('DeviceRGB');
+ }
+ this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
+ this.numComps = this.colorSpace.numComps;
+ }
+
+ this.decode = dict.get('Decode', 'D');
+
+ var mask = xref.fetchIfRef(dict.get('Mask'));
+ var smask = xref.fetchIfRef(dict.get('SMask'));
+
+ if (mask) {
+ TODO('masked images');
+ } else if (smask) {
+ this.smask = new PDFImage(xref, res, smask);
+ }
+ }
+
+ constructor.prototype = {
+ getComponents: function getComponents(buffer, decodeMap) {
+ var bpc = this.bpc;
+ if (bpc == 8)
+ return buffer;
+
+ var width = this.width;
+ var height = this.height;
+ var numComps = this.numComps;
+
+ var length = width * height;
+ var bufferPos = 0;
+ var output = bpc <= 8 ? new Uint8Array(length) :
+ bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+ var rowComps = width * numComps;
+
+ if (bpc == 1) {
+ var valueZero = 0, valueOne = 1;
+ if (decodeMap) {
+ valueZero = decodeMap[0] ? 1 : 0;
+ valueOne = decodeMap[1] ? 1 : 0;
+ }
+ var mask = 0;
+ var buf = 0;
+
+ for (var i = 0, ii = length; i < ii; ++i) {
+ if (i % rowComps == 0) {
+ mask = 0;
+ buf = 0;
+ } else {
+ mask >>= 1;
+ }
+
+ if (mask <= 0) {
+ buf = buffer[bufferPos++];
+ mask = 128;
+ }
+
+ output[i] = !(buf & mask) ? valueZero : valueOne;
+ }
+ } else {
+ if (decodeMap != null)
+ TODO('interpolate component values');
+ var bits = 0, buf = 0;
+ for (var i = 0, ii = length; i < ii; ++i) {
+ if (i % rowComps == 0) {
+ buf = 0;
+ bits = 0;
+ }
+
+ while (bits < bpc) {
+ buf = (buf << 8) | buffer[bufferPos++];
+ bits += 8;
+ }
+
+ var remainingBits = bits - bpc;
+ output[i] = buf >> remainingBits;
+ buf = buf & ((1 << remainingBits) - 1);
+ bits = remainingBits;
+ }
+ }
+ return output;
+ },
+ getOpacity: function getOpacity() {
+ var smask = this.smask;
+ var width = this.width;
+ var height = this.height;
+ var buf = new Uint8Array(width * height);
+
+ if (smask) {
+ if (smask.image.getImage) {
+ // smask is a DOM image
+ var tempCanvas = new ScratchCanvas(width, height);
+ var tempCtx = tempCanvas.getContext('2d');
+ var domImage = smask.image.getImage();
+ tempCtx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, 0, width, height);
+ var data = tempCtx.getImageData(0, 0, width, height).data;
+ for (var i = 0, j = 0, ii = width * height; i < ii; ++i, j += 4)
+ buf[i] = data[j]; // getting first component value
+ return buf;
+ }
+ var sw = smask.width;
+ var sh = smask.height;
+ if (sw != this.width || sh != this.height)
+ error('smask dimensions do not match image dimensions: ' + sw +
+ ' != ' + this.width + ', ' + sh + ' != ' + this.height);
+
+ smask.fillGrayBuffer(buf);
+ return buf;
+ } else {
+ for (var i = 0, ii = width * height; i < ii; ++i)
+ buf[i] = 255;
+ }
+ return buf;
+ },
+ applyStencilMask: function applyStencilMask(buffer, inverseDecode) {
+ var width = this.width, height = this.height;
+ var bitStrideLength = (width + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(bitStrideLength * height);
+ var imgArrayPos = 0;
+ var i, j, mask, buf;
+ // removing making non-masked pixels transparent
+ var bufferPos = 3; // alpha component offset
+ for (i = 0; i < height; i++) {
+ mask = 0;
+ for (j = 0; j < width; j++) {
+ if (!mask) {
+ buf = imgArray[imgArrayPos++];
+ mask = 128;
+ }
+ if (!(buf & mask) == inverseDecode) {
+ buffer[bufferPos] = 0;
+ }
+ bufferPos += 4;
+ mask >>= 1;
+ }
+ }
+ },
+ fillRgbaBuffer: function fillRgbaBuffer(buffer, decodeMap) {
+ var numComps = this.numComps;
+ var width = this.width;
+ var height = this.height;
+ var bpc = this.bpc;
+
+ // rows start at byte boundary;
+ var rowBytes = (width * numComps * bpc + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(height * rowBytes);
+
+ var comps = this.colorSpace.getRgbBuffer(
+ this.getComponents(imgArray, decodeMap), bpc);
+ var compsPos = 0;
+ var opacity = this.getOpacity();
+ var opacityPos = 0;
+ var length = width * height * 4;
+
+ for (var i = 0; i < length; i += 4) {
+ buffer[i] = comps[compsPos++];
+ buffer[i + 1] = comps[compsPos++];
+ buffer[i + 2] = comps[compsPos++];
+ buffer[i + 3] = opacity[opacityPos++];
+ }
+ },
+ fillGrayBuffer: function fillGrayBuffer(buffer) {
+ var numComps = this.numComps;
+ if (numComps != 1)
+ error('Reading gray scale from a color image: ' + numComps);
+
+ var width = this.width;
+ var height = this.height;
+ var bpc = this.bpc;
+
+ // rows start at byte boundary;
+ var rowBytes = (width * numComps * bpc + 7) >> 3;
+ this.image.reset();
+ var imgArray = this.image.getBytes(height * rowBytes);
+
+ var comps = this.getComponents(imgArray);
+ var length = width * height;
+
+ for (var i = 0; i < length; ++i)
+ buffer[i] = comps[i];
+ }
+ };
+ return constructor;
+})();
+
+var JpegImageLoader = (function jpegImage() {
+ function JpegImageLoader(objId, imageData, objs) {
+ var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
+
+ var img = new Image();
+ img.onload = (function jpegImageLoaderOnload() {
+ this.loaded = true;
+
+ objs.resolve(objId, this);
+
+ if (this.onLoad)
+ this.onLoad();
+ }).bind(this);
+ img.src = src;
+ this.domImage = img;
+ }
+
+ JpegImageLoader.prototype = {
+ getImage: function jpegImageLoaderGetImage() {
+ return this.domImage;
+ }
+ };
+
+ return JpegImageLoader;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/metrics.js b/apps/files_pdfviewer/js/pdfjs/src/metrics.js
new file mode 100755
index 00000000000..c21b4aed1ce
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/metrics.js
@@ -0,0 +1,2944 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Metrics = {
+ 'Courier': 600,
+ 'Courier-Bold': 600,
+ 'Courier-BoldOblique': 600,
+ 'Courier-Oblique': 600,
+ 'Helvetica' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Bold': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-BoldOblique': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Oblique' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Symbol': {
+ 'space': 250,
+ 'exclam': 333,
+ 'universal': 713,
+ 'numbersign': 500,
+ 'existential': 549,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'suchthat': 439,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asteriskmath': 500,
+ 'plus': 549,
+ 'comma': 250,
+ 'minus': 549,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 549,
+ 'equal': 549,
+ 'greater': 549,
+ 'question': 444,
+ 'congruent': 549,
+ 'Alpha': 722,
+ 'Beta': 667,
+ 'Chi': 722,
+ 'Delta': 612,
+ 'Epsilon': 611,
+ 'Phi': 763,
+ 'Gamma': 603,
+ 'Eta': 722,
+ 'Iota': 333,
+ 'theta1': 631,
+ 'Kappa': 722,
+ 'Lambda': 686,
+ 'Mu': 889,
+ 'Nu': 722,
+ 'Omicron': 722,
+ 'Pi': 768,
+ 'Theta': 741,
+ 'Rho': 556,
+ 'Sigma': 592,
+ 'Tau': 611,
+ 'Upsilon': 690,
+ 'sigma1': 439,
+ 'Omega': 768,
+ 'Xi': 645,
+ 'Psi': 795,
+ 'Zeta': 611,
+ 'bracketleft': 333,
+ 'therefore': 863,
+ 'bracketright': 333,
+ 'perpendicular': 658,
+ 'underscore': 500,
+ 'radicalex': 500,
+ 'alpha': 631,
+ 'beta': 549,
+ 'chi': 549,
+ 'delta': 494,
+ 'epsilon': 439,
+ 'phi': 521,
+ 'gamma': 411,
+ 'eta': 603,
+ 'iota': 329,
+ 'phi1': 603,
+ 'kappa': 549,
+ 'lambda': 549,
+ 'mu': 576,
+ 'nu': 521,
+ 'omicron': 549,
+ 'pi': 549,
+ 'theta': 521,
+ 'rho': 549,
+ 'sigma': 603,
+ 'tau': 439,
+ 'upsilon': 576,
+ 'omega1': 713,
+ 'omega': 686,
+ 'xi': 493,
+ 'psi': 686,
+ 'zeta': 494,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'similar': 549,
+ 'Euro': 750,
+ 'Upsilon1': 620,
+ 'minute': 247,
+ 'lessequal': 549,
+ 'fraction': 167,
+ 'infinity': 713,
+ 'florin': 500,
+ 'club': 753,
+ 'diamond': 753,
+ 'heart': 753,
+ 'spade': 753,
+ 'arrowboth': 1042,
+ 'arrowleft': 987,
+ 'arrowup': 603,
+ 'arrowright': 987,
+ 'arrowdown': 603,
+ 'degree': 400,
+ 'plusminus': 549,
+ 'second': 411,
+ 'greaterequal': 549,
+ 'multiply': 549,
+ 'proportional': 713,
+ 'partialdiff': 494,
+ 'bullet': 460,
+ 'divide': 549,
+ 'notequal': 549,
+ 'equivalence': 549,
+ 'approxequal': 549,
+ 'ellipsis': 1000,
+ 'arrowvertex': 603,
+ 'arrowhorizex': 1000,
+ 'carriagereturn': 658,
+ 'aleph': 823,
+ 'Ifraktur': 686,
+ 'Rfraktur': 795,
+ 'weierstrass': 987,
+ 'circlemultiply': 768,
+ 'circleplus': 768,
+ 'emptyset': 823,
+ 'intersection': 768,
+ 'union': 768,
+ 'propersuperset': 713,
+ 'reflexsuperset': 713,
+ 'notsubset': 713,
+ 'propersubset': 713,
+ 'reflexsubset': 713,
+ 'element': 713,
+ 'notelement': 713,
+ 'angle': 768,
+ 'gradient': 713,
+ 'registerserif': 790,
+ 'copyrightserif': 790,
+ 'trademarkserif': 890,
+ 'product': 823,
+ 'radical': 549,
+ 'dotmath': 250,
+ 'logicalnot': 713,
+ 'logicaland': 603,
+ 'logicalor': 603,
+ 'arrowdblboth': 1042,
+ 'arrowdblleft': 987,
+ 'arrowdblup': 603,
+ 'arrowdblright': 987,
+ 'arrowdbldown': 603,
+ 'lozenge': 494,
+ 'angleleft': 329,
+ 'registersans': 790,
+ 'copyrightsans': 790,
+ 'trademarksans': 786,
+ 'summation': 713,
+ 'parenlefttp': 384,
+ 'parenleftex': 384,
+ 'parenleftbt': 384,
+ 'bracketlefttp': 384,
+ 'bracketleftex': 384,
+ 'bracketleftbt': 384,
+ 'bracelefttp': 494,
+ 'braceleftmid': 494,
+ 'braceleftbt': 494,
+ 'braceex': 494,
+ 'angleright': 329,
+ 'integral': 274,
+ 'integraltp': 686,
+ 'integralex': 686,
+ 'integralbt': 686,
+ 'parenrighttp': 384,
+ 'parenrightex': 384,
+ 'parenrightbt': 384,
+ 'bracketrighttp': 384,
+ 'bracketrightex': 384,
+ 'bracketrightbt': 384,
+ 'bracerighttp': 494,
+ 'bracerightmid': 494,
+ 'bracerightbt': 494,
+ 'apple': 790
+ },
+ 'Times-Roman': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 408,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 564,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 564,
+ 'equal': 564,
+ 'greater': 564,
+ 'question': 444,
+ 'at': 921,
+ 'A': 722,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 556,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 389,
+ 'K': 722,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 556,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 722,
+ 'W': 944,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 469,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 444,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 333,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'asciitilde': 541,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 180,
+ 'quotedblleft': 444,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 453,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 444,
+ 'quotedblright': 444,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 444,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 889,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 444,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 564,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 444,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 444,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 444,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 444,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 444,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 444,
+ 'Amacron': 722,
+ 'rcaron': 333,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 556,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 588,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 564,
+ 'uacute': 500,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 444,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 722,
+ 'Iacute': 333,
+ 'plusminus': 564,
+ 'brokenbar': 200,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 333,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 326,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 444,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 344,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 722,
+ 'zdotaccent': 444,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 500,
+ 'minus': 564,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 564,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Bold': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 1000,
+ 'ampersand': 833,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 930,
+ 'A': 722,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 778,
+ 'L': 667,
+ 'M': 944,
+ 'N': 722,
+ 'O': 778,
+ 'P': 611,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 556,
+ 'T': 667,
+ 'U': 722,
+ 'V': 722,
+ 'W': 1000,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 667,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 581,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 556,
+ 'c': 444,
+ 'd': 556,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 333,
+ 'k': 556,
+ 'l': 278,
+ 'm': 833,
+ 'n': 556,
+ 'o': 500,
+ 'p': 556,
+ 'q': 556,
+ 'r': 444,
+ 's': 389,
+ 't': 333,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 394,
+ 'bar': 220,
+ 'braceright': 394,
+ 'asciitilde': 520,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 540,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 300,
+ 'Lslash': 667,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 330,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 556,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 570,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 667,
+ 'Cacute': 722,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 722,
+ 'rcaron': 444,
+ 'ccedilla': 444,
+ 'Zdotaccent': 667,
+ 'Thorn': 611,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 556,
+ 'dcaron': 672,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 667,
+ 'partialdiff': 494,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 778,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 444,
+ 'omacron': 500,
+ 'Zacute': 667,
+ 'Zcaron': 667,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 416,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 300,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 394,
+ 'Kcommaaccent': 778,
+ 'Lacute': 667,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 667,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 444,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 667,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 444,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 556,
+ 'minus': 570,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 333,
+ 'logicalnot': 570,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-BoldItalic': {
+ 'space': 250,
+ 'exclam': 389,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 832,
+ 'A': 667,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 667,
+ 'F': 667,
+ 'G': 722,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 667,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 889,
+ 'X': 667,
+ 'Y': 611,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 570,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 556,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 556,
+ 'v': 444,
+ 'w': 667,
+ 'x': 500,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 348,
+ 'bar': 220,
+ 'braceright': 348,
+ 'asciitilde': 570,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 500,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 944,
+ 'ordfeminine': 266,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 300,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 611,
+ 'divide': 570,
+ 'Yacute': 611,
+ 'Acircumflex': 667,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 667,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 608,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 444,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 722,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 366,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 576,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 382,
+ 'Kcommaaccent': 667,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 500,
+ 'minus': 606,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 606,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Italic': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 420,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 675,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 675,
+ 'equal': 675,
+ 'greater': 675,
+ 'question': 500,
+ 'at': 920,
+ 'A': 611,
+ 'B': 611,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 611,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 444,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 667,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 611,
+ 'S': 500,
+ 'T': 556,
+ 'U': 722,
+ 'V': 611,
+ 'W': 833,
+ 'X': 611,
+ 'Y': 556,
+ 'Z': 556,
+ 'bracketleft': 389,
+ 'backslash': 278,
+ 'bracketright': 389,
+ 'asciicircum': 422,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 278,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 444,
+ 'l': 278,
+ 'm': 722,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 444,
+ 'w': 667,
+ 'x': 444,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 400,
+ 'bar': 275,
+ 'braceright': 400,
+ 'asciitilde': 541,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 214,
+ 'quotedblleft': 556,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 523,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 556,
+ 'quotedblright': 556,
+ 'guillemotright': 500,
+ 'ellipsis': 889,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 889,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 556,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 667,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 556,
+ 'divide': 675,
+ 'Yacute': 556,
+ 'Acircumflex': 611,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 667,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 556,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 611,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 500,
+ 'Amacron': 611,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 556,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 611,
+ 'Sacute': 500,
+ 'dcaron': 544,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 611,
+ 'Abreve': 611,
+ 'multiply': 675,
+ 'uacute': 500,
+ 'Tcaron': 556,
+ 'partialdiff': 476,
+ 'ydieresis': 444,
+ 'Nacute': 667,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 667,
+ 'Iacute': 333,
+ 'plusminus': 675,
+ 'brokenbar': 275,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 556,
+ 'Zcaron': 556,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 300,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 611,
+ 'Adieresis': 611,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 500,
+ 'lcaron': 300,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 500,
+ 'Scommaaccent': 500,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 667,
+ 'otilde': 500,
+ 'Rcommaaccent': 611,
+ 'Lcommaaccent': 556,
+ 'Atilde': 611,
+ 'Aogonek': 611,
+ 'Aring': 611,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 444,
+ 'minus': 675,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 675,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'ZapfDingbats': {
+ 'space': 278,
+ 'a1': 974,
+ 'a2': 961,
+ 'a202': 974,
+ 'a3': 980,
+ 'a4': 719,
+ 'a5': 789,
+ 'a119': 790,
+ 'a118': 791,
+ 'a117': 690,
+ 'a11': 960,
+ 'a12': 939,
+ 'a13': 549,
+ 'a14': 855,
+ 'a15': 911,
+ 'a16': 933,
+ 'a105': 911,
+ 'a17': 945,
+ 'a18': 974,
+ 'a19': 755,
+ 'a20': 846,
+ 'a21': 762,
+ 'a22': 761,
+ 'a23': 571,
+ 'a24': 677,
+ 'a25': 763,
+ 'a26': 760,
+ 'a27': 759,
+ 'a28': 754,
+ 'a6': 494,
+ 'a7': 552,
+ 'a8': 537,
+ 'a9': 577,
+ 'a10': 692,
+ 'a29': 786,
+ 'a30': 788,
+ 'a31': 788,
+ 'a32': 790,
+ 'a33': 793,
+ 'a34': 794,
+ 'a35': 816,
+ 'a36': 823,
+ 'a37': 789,
+ 'a38': 841,
+ 'a39': 823,
+ 'a40': 833,
+ 'a41': 816,
+ 'a42': 831,
+ 'a43': 923,
+ 'a44': 744,
+ 'a45': 723,
+ 'a46': 749,
+ 'a47': 790,
+ 'a48': 792,
+ 'a49': 695,
+ 'a50': 776,
+ 'a51': 768,
+ 'a52': 792,
+ 'a53': 759,
+ 'a54': 707,
+ 'a55': 708,
+ 'a56': 682,
+ 'a57': 701,
+ 'a58': 826,
+ 'a59': 815,
+ 'a60': 789,
+ 'a61': 789,
+ 'a62': 707,
+ 'a63': 687,
+ 'a64': 696,
+ 'a65': 689,
+ 'a66': 786,
+ 'a67': 787,
+ 'a68': 713,
+ 'a69': 791,
+ 'a70': 785,
+ 'a71': 791,
+ 'a72': 873,
+ 'a73': 761,
+ 'a74': 762,
+ 'a203': 762,
+ 'a75': 759,
+ 'a204': 759,
+ 'a76': 892,
+ 'a77': 892,
+ 'a78': 788,
+ 'a79': 784,
+ 'a81': 438,
+ 'a82': 138,
+ 'a83': 277,
+ 'a84': 415,
+ 'a97': 392,
+ 'a98': 392,
+ 'a99': 668,
+ 'a100': 668,
+ 'a89': 390,
+ 'a90': 390,
+ 'a93': 317,
+ 'a94': 317,
+ 'a91': 276,
+ 'a92': 276,
+ 'a205': 509,
+ 'a85': 509,
+ 'a206': 410,
+ 'a86': 410,
+ 'a87': 234,
+ 'a88': 234,
+ 'a95': 334,
+ 'a96': 334,
+ 'a101': 732,
+ 'a102': 544,
+ 'a103': 544,
+ 'a104': 910,
+ 'a106': 667,
+ 'a107': 760,
+ 'a108': 760,
+ 'a112': 776,
+ 'a111': 595,
+ 'a110': 694,
+ 'a109': 626,
+ 'a120': 788,
+ 'a121': 788,
+ 'a122': 788,
+ 'a123': 788,
+ 'a124': 788,
+ 'a125': 788,
+ 'a126': 788,
+ 'a127': 788,
+ 'a128': 788,
+ 'a129': 788,
+ 'a130': 788,
+ 'a131': 788,
+ 'a132': 788,
+ 'a133': 788,
+ 'a134': 788,
+ 'a135': 788,
+ 'a136': 788,
+ 'a137': 788,
+ 'a138': 788,
+ 'a139': 788,
+ 'a140': 788,
+ 'a141': 788,
+ 'a142': 788,
+ 'a143': 788,
+ 'a144': 788,
+ 'a145': 788,
+ 'a146': 788,
+ 'a147': 788,
+ 'a148': 788,
+ 'a149': 788,
+ 'a150': 788,
+ 'a151': 788,
+ 'a152': 788,
+ 'a153': 788,
+ 'a154': 788,
+ 'a155': 788,
+ 'a156': 788,
+ 'a157': 788,
+ 'a158': 788,
+ 'a159': 788,
+ 'a160': 894,
+ 'a161': 838,
+ 'a163': 1016,
+ 'a164': 458,
+ 'a196': 748,
+ 'a165': 924,
+ 'a192': 748,
+ 'a166': 918,
+ 'a167': 927,
+ 'a168': 928,
+ 'a169': 928,
+ 'a170': 834,
+ 'a171': 873,
+ 'a172': 828,
+ 'a173': 924,
+ 'a162': 924,
+ 'a174': 917,
+ 'a175': 930,
+ 'a176': 931,
+ 'a177': 463,
+ 'a178': 883,
+ 'a179': 836,
+ 'a193': 836,
+ 'a180': 867,
+ 'a199': 867,
+ 'a181': 696,
+ 'a200': 696,
+ 'a182': 874,
+ 'a201': 874,
+ 'a183': 760,
+ 'a184': 946,
+ 'a197': 771,
+ 'a185': 865,
+ 'a194': 771,
+ 'a198': 888,
+ 'a186': 967,
+ 'a195': 888,
+ 'a187': 831,
+ 'a188': 873,
+ 'a189': 927,
+ 'a190': 970,
+ 'a191': 918
+ }
+};
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/obj.js b/apps/files_pdfviewer/js/pdfjs/src/obj.js
new file mode 100755
index 00000000000..7aebb732ad2
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/obj.js
@@ -0,0 +1,742 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Name = (function nameName() {
+ function constructor(name) {
+ this.name = name;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+var Cmd = (function cmdCmd() {
+ function constructor(cmd) {
+ this.cmd = cmd;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+var Dict = (function dictDict() {
+ function constructor() {
+ this.map = Object.create(null);
+ }
+
+ constructor.prototype = {
+ get: function dictGet(key1, key2, key3) {
+ var value;
+ if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
+ typeof key2 == 'undefined') {
+ return value;
+ }
+ if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map ||
+ typeof key3 == 'undefined') {
+ return value;
+ }
+
+ return this.map[key3] || null;
+ },
+
+ set: function dictSet(key, value) {
+ this.map[key] = value;
+ },
+
+ has: function dictHas(key) {
+ return key in this.map;
+ },
+
+ forEach: function dictForEach(callback) {
+ for (var key in this.map) {
+ callback(key, this.map[key]);
+ }
+ }
+ };
+
+ return constructor;
+})();
+
+var Ref = (function refRef() {
+ function constructor(num, gen) {
+ this.num = num;
+ this.gen = gen;
+ }
+
+ constructor.prototype = {
+ };
+
+ return constructor;
+})();
+
+// The reference is identified by number and generation,
+// this structure stores only one instance of the reference.
+var RefSet = (function refSet() {
+ function constructor() {
+ this.dict = {};
+ }
+
+ constructor.prototype = {
+ has: function refSetHas(ref) {
+ return !!this.dict['R' + ref.num + '.' + ref.gen];
+ },
+
+ put: function refSetPut(ref) {
+ this.dict['R' + ref.num + '.' + ref.gen] = ref;
+ }
+ };
+
+ return constructor;
+})();
+
+var Catalog = (function catalogCatalog() {
+ function constructor(xref) {
+ this.xref = xref;
+ var obj = xref.getCatalogObj();
+ assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
+ this.catDict = obj;
+ }
+
+ constructor.prototype = {
+ get toplevelPagesDict() {
+ var pagesObj = this.catDict.get('Pages');
+ assertWellFormed(isRef(pagesObj), 'invalid top-level pages reference');
+ var xrefObj = this.xref.fetch(pagesObj);
+ assertWellFormed(isDict(xrefObj), 'invalid top-level pages dictionary');
+ // shadow the prototype getter
+ return shadow(this, 'toplevelPagesDict', xrefObj);
+ },
+ get documentOutline() {
+ var obj = this.catDict.get('Outlines');
+ var xref = this.xref;
+ var root = { items: [] };
+ if (isRef(obj)) {
+ obj = xref.fetch(obj).get('First');
+ var processed = new RefSet();
+ if (isRef(obj)) {
+ var queue = [{obj: obj, parent: root}];
+ // to avoid recursion keeping track of the items
+ // in the processed dictionary
+ processed.put(obj);
+ while (queue.length > 0) {
+ var i = queue.shift();
+ var outlineDict = xref.fetch(i.obj);
+ if (!outlineDict.has('Title'))
+ error('Invalid outline item');
+ var dest = outlineDict.get('A');
+ if (dest)
+ dest = xref.fetchIfRef(dest).get('D');
+ else if (outlineDict.has('Dest')) {
+ dest = outlineDict.get('Dest');
+ if (isName(dest))
+ dest = dest.name;
+ }
+ var title = xref.fetchIfRef(outlineDict.get('Title'));
+ var outlineItem = {
+ dest: dest,
+ title: stringToPDFString(title),
+ color: outlineDict.get('C') || [0, 0, 0],
+ count: outlineDict.get('Count'),
+ bold: !!(outlineDict.get('F') & 2),
+ italic: !!(outlineDict.get('F') & 1),
+ items: []
+ };
+ i.parent.items.push(outlineItem);
+ obj = outlineDict.get('First');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: outlineItem});
+ processed.put(obj);
+ }
+ obj = outlineDict.get('Next');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: i.parent});
+ processed.put(obj);
+ }
+ }
+ }
+ }
+ obj = root.items.length > 0 ? root.items : null;
+ return shadow(this, 'documentOutline', obj);
+ },
+ get numPages() {
+ var obj = this.toplevelPagesDict.get('Count');
+ assertWellFormed(
+ isInt(obj),
+ 'page count in top level pages object is not an integer'
+ );
+ // shadow the prototype getter
+ return shadow(this, 'num', obj);
+ },
+ traverseKids: function catalogTraverseKids(pagesDict) {
+ var pageCache = this.pageCache;
+ var kids = pagesDict.get('Kids');
+ assertWellFormed(isArray(kids),
+ 'page dictionary kids object is not an array');
+ for (var i = 0, ii = kids.length; i < ii; ++i) {
+ var kid = kids[i];
+ assertWellFormed(isRef(kid),
+ 'page dictionary kid is not a reference');
+ var obj = this.xref.fetch(kid);
+ if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
+ pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
+ } else { // must be a child page dictionary
+ assertWellFormed(
+ isDict(obj),
+ 'page dictionary kid reference points to wrong type of object'
+ );
+ this.traverseKids(obj);
+ }
+ }
+ },
+ get destinations() {
+ function fetchDestination(xref, ref) {
+ var dest = xref.fetchIfRef(ref);
+ return isDict(dest) ? dest.get('D') : dest;
+ }
+
+ var xref = this.xref;
+ var dests = {}, nameTreeRef, nameDictionaryRef;
+ var obj = this.catDict.get('Names');
+ if (obj)
+ nameTreeRef = xref.fetchIfRef(obj).get('Dests');
+ else if (this.catDict.has('Dests'))
+ nameDictionaryRef = this.catDict.get('Dests');
+
+ if (nameDictionaryRef) {
+ // reading simple destination dictionary
+ obj = xref.fetchIfRef(nameDictionaryRef);
+ obj.forEach(function catalogForEach(key, value) {
+ if (!value) return;
+ dests[key] = fetchDestination(xref, value);
+ });
+ }
+ if (nameTreeRef) {
+ // reading name tree
+ var processed = new RefSet();
+ processed.put(nameTreeRef);
+ var queue = [nameTreeRef];
+ while (queue.length > 0) {
+ var i, n;
+ obj = xref.fetch(queue.shift());
+ if (obj.has('Kids')) {
+ var kids = obj.get('Kids');
+ for (i = 0, n = kids.length; i < n; i++) {
+ var kid = kids[i];
+ if (processed.has(kid))
+ error('invalid destinations');
+ queue.push(kid);
+ processed.put(kid);
+ }
+ continue;
+ }
+ var names = obj.get('Names');
+ for (i = 0, n = names.length; i < n; i += 2) {
+ dests[names[i]] = fetchDestination(xref, names[i + 1]);
+ }
+ }
+ }
+ return shadow(this, 'destinations', dests);
+ },
+ getPage: function catalogGetPage(n) {
+ var pageCache = this.pageCache;
+ if (!pageCache) {
+ pageCache = this.pageCache = [];
+ this.traverseKids(this.toplevelPagesDict);
+ }
+ return this.pageCache[n - 1];
+ }
+ };
+
+ return constructor;
+})();
+
+var XRef = (function xRefXRef() {
+ function constructor(stream, startXRef, mainXRefEntriesOffset) {
+ this.stream = stream;
+ this.entries = [];
+ this.xrefstms = {};
+ var trailerDict = this.readXRef(startXRef);
+
+ // prepare the XRef cache
+ this.cache = [];
+
+ var encrypt = trailerDict.get('Encrypt');
+ if (encrypt) {
+ var fileId = trailerDict.get('ID');
+ this.encrypt = new CipherTransformFactory(this.fetch(encrypt),
+ fileId[0] /*, password */);
+ }
+
+ // get the root dictionary (catalog) object
+ if (!isRef(this.root = trailerDict.get('Root')))
+ error('Invalid root reference');
+ }
+
+ constructor.prototype = {
+ readXRefTable: function readXRefTable(parser) {
+ var obj;
+ while (true) {
+ if (isCmd(obj = parser.getObj(), 'trailer'))
+ break;
+ if (!isInt(obj))
+ error('Invalid XRef table');
+ var first = obj;
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table');
+ var n = obj;
+ if (first < 0 || n < 0 || (first + n) != ((first + n) | 0))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ for (var i = first; i < first + n; ++i) {
+ var entry = {};
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ entry.offset = obj;
+ if (!isInt(obj = parser.getObj()))
+ error('Invalid XRef table: ' + first + ', ' + n);
+ entry.gen = obj;
+ obj = parser.getObj();
+ if (isCmd(obj, 'n')) {
+ entry.uncompressed = true;
+ } else if (isCmd(obj, 'f')) {
+ entry.free = true;
+ } else {
+ error('Invalid XRef table: ' + first + ', ' + n);
+ }
+ if (!this.entries[i]) {
+ // In some buggy PDF files the xref table claims to start at 1
+ // instead of 0.
+ if (i == 1 && first == 1 &&
+ entry.offset == 0 && entry.gen == 65535 && entry.free) {
+ i = first = 0;
+ }
+ this.entries[i] = entry;
+ }
+ }
+ }
+
+ // read the trailer dictionary
+ var dict;
+ if (!isDict(dict = parser.getObj()))
+ error('Invalid XRef table');
+
+ // get the 'Prev' pointer
+ var prev;
+ obj = dict.get('Prev');
+ if (isInt(obj)) {
+ prev = obj;
+ } else if (isRef(obj)) {
+ // certain buggy PDF generators generate "/Prev NNN 0 R" instead
+ // of "/Prev NNN"
+ prev = obj.num;
+ }
+ if (prev) {
+ this.readXRef(prev);
+ }
+
+ // check for 'XRefStm' key
+ if (isInt(obj = dict.get('XRefStm'))) {
+ var pos = obj;
+ // ignore previously loaded xref streams (possible infinite recursion)
+ if (!(pos in this.xrefstms)) {
+ this.xrefstms[pos] = 1;
+ this.readXRef(pos);
+ }
+ }
+
+ return dict;
+ },
+ readXRefStream: function readXRefStream(stream) {
+ var streamParameters = stream.parameters;
+ var byteWidths = streamParameters.get('W');
+ var range = streamParameters.get('Index');
+ if (!range)
+ range = [0, streamParameters.get('Size')];
+ var i, j;
+ while (range.length > 0) {
+ var first = range[0], n = range[1];
+ if (!isInt(first) || !isInt(n))
+ error('Invalid XRef range fields: ' + first + ', ' + n);
+ var typeFieldWidth = byteWidths[0];
+ var offsetFieldWidth = byteWidths[1];
+ var generationFieldWidth = byteWidths[2];
+ if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
+ !isInt(generationFieldWidth)) {
+ error('Invalid XRef entry fields length: ' + first + ', ' + n);
+ }
+ for (i = 0; i < n; ++i) {
+ var type = 0, offset = 0, generation = 0;
+ for (j = 0; j < typeFieldWidth; ++j)
+ type = (type << 8) | stream.getByte();
+ // if type field is absent, its default value = 1
+ if (typeFieldWidth == 0)
+ type = 1;
+ for (j = 0; j < offsetFieldWidth; ++j)
+ offset = (offset << 8) | stream.getByte();
+ for (j = 0; j < generationFieldWidth; ++j)
+ generation = (generation << 8) | stream.getByte();
+ var entry = {};
+ entry.offset = offset;
+ entry.gen = generation;
+ switch (type) {
+ case 0:
+ entry.free = true;
+ break;
+ case 1:
+ entry.uncompressed = true;
+ break;
+ case 2:
+ break;
+ default:
+ error('Invalid XRef entry type: ' + type);
+ }
+ if (!this.entries[first + i])
+ this.entries[first + i] = entry;
+ }
+ range.splice(0, 2);
+ }
+ var prev = streamParameters.get('Prev');
+ if (isInt(prev))
+ this.readXRef(prev);
+ return streamParameters;
+ },
+ indexObjects: function indexObjects() {
+ // Simple scan through the PDF content to find objects,
+ // trailers and XRef streams.
+ function readToken(data, offset) {
+ var token = '', ch = data[offset];
+ while (ch !== 13 && ch !== 10) {
+ if (++offset >= data.length)
+ break;
+ token += String.fromCharCode(ch);
+ ch = data[offset];
+ }
+ return token;
+ }
+ function skipUntil(data, offset, what) {
+ var length = what.length, dataLength = data.length;
+ var skipped = 0;
+ // finding byte sequence
+ while (offset < dataLength) {
+ var i = 0;
+ while (i < length && data[offset + i] == what[i])
+ ++i;
+ if (i >= length)
+ break; // sequence found
+
+ offset++;
+ skipped++;
+ }
+ return skipped;
+ }
+ var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+ var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
+ 101, 102]);
+ var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
+ var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+
+ var stream = this.stream;
+ stream.pos = 0;
+ var buffer = stream.getBytes();
+ var position = stream.start, length = buffer.length;
+ var trailers = [], xrefStms = [];
+ var state = 0;
+ var currentToken;
+ while (position < length) {
+ var ch = buffer[position];
+ if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
+ ++position;
+ continue;
+ }
+ if (ch === 37) { // %-comment
+ do {
+ ++position;
+ ch = buffer[position];
+ } while (ch !== 13 && ch !== 10);
+ continue;
+ }
+ var token = readToken(buffer, position);
+ var m;
+ if (token === 'xref') {
+ position += skipUntil(buffer, position, trailerBytes);
+ trailers.push(position);
+ position += skipUntil(buffer, position, startxrefBytes);
+ } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
+ this.entries[m[1]] = {
+ offset: position,
+ gen: m[2] | 0,
+ uncompressed: true
+ };
+
+ var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
+ var content = buffer.subarray(position, position + contentLength);
+
+ // checking XRef stream suspect
+ // (it shall have '/XRef' and next char is not a letter)
+ var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+ if (xrefTagOffset < contentLength &&
+ content[xrefTagOffset + 5] < 64) {
+ xrefStms.push(position);
+ this.xrefstms[position] = 1; // don't read it recursively
+ }
+
+ position += contentLength;
+ } else
+ position += token.length + 1;
+ }
+ // reading XRef streams
+ for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
+ this.readXRef(xrefStms[i]);
+ }
+ // finding main trailer
+ var dict;
+ for (var i = 0, ii = trailers.length; i < ii; ++i) {
+ stream.pos = trailers[i];
+ var parser = new Parser(new Lexer(stream), true);
+ var obj = parser.getObj();
+ if (!isCmd(obj, 'trailer'))
+ continue;
+ // read the trailer dictionary
+ if (!isDict(dict = parser.getObj()))
+ continue;
+ // taking the first one with 'ID'
+ if (dict.has('ID'))
+ return dict;
+ }
+ // no tailer with 'ID', taking last one (if exists)
+ if (dict)
+ return dict;
+ // nothing helps
+ error('Invalid PDF structure');
+ return null;
+ },
+ readXRef: function readXref(startXRef) {
+ var stream = this.stream;
+ stream.pos = startXRef;
+ var parser = new Parser(new Lexer(stream), true);
+ var obj = parser.getObj();
+ // parse an old-style xref table
+ if (isCmd(obj, 'xref'))
+ return this.readXRefTable(parser);
+ // parse an xref stream
+ if (isInt(obj)) {
+ if (!isInt(parser.getObj()) ||
+ !isCmd(parser.getObj(), 'obj') ||
+ !isStream(obj = parser.getObj())) {
+ error('Invalid XRef stream');
+ }
+ return this.readXRefStream(obj);
+ }
+ return this.indexObjects();
+ },
+ getEntry: function xRefGetEntry(i) {
+ var e = this.entries[i];
+ if (e.free)
+ error('reading an XRef stream not implemented yet');
+ return e;
+ },
+ fetchIfRef: function xRefFetchIfRef(obj) {
+ if (!isRef(obj))
+ return obj;
+ return this.fetch(obj);
+ },
+ fetch: function xRefFetch(ref, suppressEncryption) {
+ var num = ref.num;
+ var e = this.cache[num];
+ if (e)
+ return e;
+
+ e = this.getEntry(num);
+ var gen = ref.gen;
+ var stream, parser;
+ if (e.uncompressed) {
+ if (e.gen != gen)
+ throw ('inconsistent generation in XRef');
+ stream = this.stream.makeSubStream(e.offset);
+ parser = new Parser(new Lexer(stream), true, this);
+ var obj1 = parser.getObj();
+ var obj2 = parser.getObj();
+ var obj3 = parser.getObj();
+ if (!isInt(obj1) || obj1 != num ||
+ !isInt(obj2) || obj2 != gen ||
+ !isCmd(obj3)) {
+ error('bad XRef entry');
+ }
+ if (!isCmd(obj3, 'obj')) {
+ // some bad pdfs use "obj1234" and really mean 1234
+ if (obj3.cmd.indexOf('obj') == 0) {
+ num = parseInt(obj3.cmd.substring(3), 10);
+ if (!isNaN(num))
+ return num;
+ }
+ error('bad XRef entry');
+ }
+ if (this.encrypt && !suppressEncryption) {
+ try {
+ e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
+ } catch (ex) {
+ // almost all streams must be encrypted, but sometimes
+ // they are not probably due to some broken generators
+ // re-trying without encryption
+ return this.fetch(ref, true);
+ }
+ } else {
+ e = parser.getObj();
+ }
+ // Don't cache streams since they are mutable (except images).
+ if (!isStream(e) || e.getImage)
+ this.cache[num] = e;
+ return e;
+ }
+
+ // compressed entry
+ stream = this.fetch(new Ref(e.offset, 0));
+ if (!isStream(stream))
+ error('bad ObjStm stream');
+ var first = stream.parameters.get('First');
+ var n = stream.parameters.get('N');
+ if (!isInt(first) || !isInt(n)) {
+ error('invalid first and n parameters for ObjStm stream');
+ }
+ parser = new Parser(new Lexer(stream), false);
+ var i, entries = [], nums = [];
+ // read the object numbers to populate cache
+ for (i = 0; i < n; ++i) {
+ num = parser.getObj();
+ if (!isInt(num)) {
+ error('invalid object number in the ObjStm stream: ' + num);
+ }
+ nums.push(num);
+ var offset = parser.getObj();
+ if (!isInt(offset)) {
+ error('invalid object offset in the ObjStm stream: ' + offset);
+ }
+ }
+ // read stream objects for cache
+ for (i = 0; i < n; ++i) {
+ entries.push(parser.getObj());
+ this.cache[nums[i]] = entries[i];
+ }
+ e = entries[e.gen];
+ if (!e) {
+ error('bad XRef entry for compressed object');
+ }
+ return e;
+ },
+ getCatalogObj: function xRefGetCatalogObj() {
+ return this.fetch(this.root);
+ }
+ };
+
+ return constructor;
+})();
+
+/**
+ * A PDF document and page is built of many objects. E.g. there are objects
+ * for fonts, images, rendering code and such. These objects might get processed
+ * inside of a worker. The `PDFObjects` implements some basic functions to
+ * manage these objects.
+ */
+var PDFObjects = (function pdfObjects() {
+ function PDFObjects() {
+ this.objs = {};
+ }
+
+ PDFObjects.prototype = {
+ objs: null,
+
+ /**
+ * Internal function.
+ * Ensures there is an object defined for `objId`. Stores `data` on the
+ * object *if* it is created.
+ */
+ ensureObj: function pdfObjectsEnsureObj(objId, data) {
+ if (this.objs[objId])
+ return this.objs[objId];
+ return this.objs[objId] = new Promise(objId, data);
+ },
+
+ /**
+ * If called *without* callback, this returns the data of `objId` but the
+ * object needs to be resolved. If it isn't, this function throws.
+ *
+ * If called *with* a callback, the callback is called with the data of the
+ * object once the object is resolved. That means, if you call this
+ * function and the object is already resolved, the callback gets called
+ * right away.
+ */
+ get: function pdfObjectsGet(objId, callback) {
+ // If there is a callback, then the get can be async and the object is
+ // not required to be resolved right now
+ if (callback) {
+ this.ensureObj(objId).then(callback);
+ return null;
+ }
+
+ // If there isn't a callback, the user expects to get the resolved data
+ // directly.
+ var obj = this.objs[objId];
+
+ // If there isn't an object yet or the object isn't resolved, then the
+ // data isn't ready yet!
+ if (!obj || !obj.isResolved) {
+ throw 'Requesting object that isn\'t resolved yet ' + objId;
+ return null;
+ } else {
+ return obj.data;
+ }
+ },
+
+ /**
+ * Resolves the object `objId` with optional `data`.
+ */
+ resolve: function pdfObjectsResolve(objId, data) {
+ var objs = this.objs;
+
+ // In case there is a promise already on this object, just resolve it.
+ if (objs[objId]) {
+ objs[objId].resolve(data);
+ } else {
+ this.ensureObj(objId, data);
+ }
+ },
+
+ onData: function pdfObjectsOnData(objId, callback) {
+ this.ensureObj(objId).onData(callback);
+ },
+
+ isResolved: function pdfObjectsIsResolved(objId) {
+ var objs = this.objs;
+ if (!objs[objId]) {
+ return false;
+ } else {
+ return objs[objId].isResolved;
+ }
+ },
+
+ hasData: function pdfObjectsHasData(objId) {
+ var objs = this.objs;
+ if (!objs[objId]) {
+ return false;
+ } else {
+ return objs[objId].hasData;
+ }
+ },
+
+ /**
+ * Sets the data of an object but *doesn't* resolve it.
+ */
+ setData: function pdfObjectsSetData(objId, data) {
+ // Watchout! If you call `this.ensureObj(objId, data)` you're going to
+ // create a *resolved* promise which shouldn't be the case!
+ this.ensureObj(objId).data = data;
+ }
+ };
+ return PDFObjects;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/parser.js b/apps/files_pdfviewer/js/pdfjs/src/parser.js
new file mode 100755
index 00000000000..93a3f21b52a
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/parser.js
@@ -0,0 +1,636 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var EOF = {};
+
+function isEOF(v) {
+ return v == EOF;
+}
+
+var Parser = (function parserParser() {
+ function constructor(lexer, allowStreams, xref) {
+ this.lexer = lexer;
+ this.allowStreams = allowStreams;
+ this.xref = xref;
+ this.inlineImg = 0;
+ this.refill();
+ }
+
+ constructor.prototype = {
+ refill: function parserRefill() {
+ this.buf1 = this.lexer.getObj();
+ this.buf2 = this.lexer.getObj();
+ },
+ shift: function parserShift() {
+ if (isCmd(this.buf2, 'ID')) {
+ this.buf1 = this.buf2;
+ this.buf2 = null;
+ // skip byte after ID
+ this.lexer.skip();
+ } else {
+ this.buf1 = this.buf2;
+ this.buf2 = this.lexer.getObj();
+ }
+ },
+ getObj: function parserGetObj(cipherTransform) {
+ if (isCmd(this.buf1, 'BI')) { // inline image
+ this.shift();
+ return this.makeInlineImage(cipherTransform);
+ }
+ if (isCmd(this.buf1, '[')) { // array
+ this.shift();
+ var array = [];
+ while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
+ array.push(this.getObj());
+ if (isEOF(this.buf1))
+ error('End of file inside array');
+ this.shift();
+ return array;
+ }
+ if (isCmd(this.buf1, '<<')) { // dictionary or stream
+ this.shift();
+ var dict = new Dict();
+ while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ error('Dictionary key must be a name object');
+ } else {
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1))
+ break;
+ dict.set(key, this.getObj(cipherTransform));
+ }
+ }
+ if (isEOF(this.buf1))
+ error('End of file inside dictionary');
+
+ // stream objects are not allowed inside content streams or
+ // object streams
+ if (isCmd(this.buf2, 'stream')) {
+ return this.allowStreams ?
+ this.makeStream(dict, cipherTransform) : dict;
+ }
+ this.shift();
+ return dict;
+ }
+ if (isInt(this.buf1)) { // indirect reference or integer
+ var num = this.buf1;
+ this.shift();
+ if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
+ var ref = new Ref(num, this.buf1);
+ this.shift();
+ this.shift();
+ return ref;
+ }
+ return num;
+ }
+ if (isString(this.buf1)) { // string
+ var str = this.buf1;
+ this.shift();
+ if (cipherTransform)
+ str = cipherTransform.decryptString(str);
+ return str;
+ }
+
+ // simple object
+ var obj = this.buf1;
+ this.shift();
+ return obj;
+ },
+ makeInlineImage: function parserMakeInlineImage(cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // parse dictionary
+ var dict = new Dict();
+ while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ error('Dictionary key must be a name object');
+ } else {
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1))
+ break;
+ dict.set(key, this.getObj(cipherTransform));
+ }
+ }
+
+ // parse image stream
+ var startPos = stream.pos;
+
+ // searching for the /\sEI\s/
+ var state = 0, ch;
+ while (state != 4 && (ch = stream.getByte()) != null) {
+ switch (ch) {
+ case 0x20:
+ case 0x0D:
+ case 0x0A:
+ state = state === 3 ? 4 : 1;
+ break;
+ case 0x45:
+ state = state === 1 ? 2 : 0;
+ break;
+ case 0x49:
+ state = state === 2 ? 3 : 0;
+ break;
+ default:
+ state = 0;
+ break;
+ }
+ }
+
+ // TODO improve the small images performance to remove the limit
+ var inlineImgLimit = 500;
+ if (++this.inlineImg >= inlineImgLimit) {
+ if (this.inlineImg === inlineImgLimit)
+ warn('Too many inline images');
+ this.shift();
+ return null;
+ }
+
+ var length = (stream.pos - 4) - startPos;
+ var imageStream = stream.makeSubStream(startPos, length, dict);
+ if (cipherTransform)
+ imageStream = cipherTransform.createStream(imageStream);
+ imageStream = this.filter(imageStream, dict, length);
+ imageStream.parameters = dict;
+
+ this.buf2 = new Cmd('EI');
+ this.shift();
+
+ return imageStream;
+ },
+ makeStream: function parserMakeStream(dict, cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // get stream start position
+ lexer.skipToNextLine();
+ var pos = stream.pos;
+
+ // get length
+ var length = dict.get('Length');
+ var xref = this.xref;
+ if (xref)
+ length = xref.fetchIfRef(length);
+ if (!isInt(length)) {
+ error('Bad ' + length + ' attribute in stream');
+ length = 0;
+ }
+
+ // skip over the stream data
+ stream.pos = pos + length;
+ this.shift(); // '>>'
+ this.shift(); // 'stream'
+ if (!isCmd(this.buf1, 'endstream'))
+ error('Missing endstream');
+ this.shift();
+
+ stream = stream.makeSubStream(pos, length, dict);
+ if (cipherTransform)
+ stream = cipherTransform.createStream(stream);
+ stream = this.filter(stream, dict, length);
+ stream.parameters = dict;
+ return stream;
+ },
+ filter: function parserFilter(stream, dict, length) {
+ var filter = dict.get('Filter', 'F');
+ var params = dict.get('DecodeParms', 'DP');
+ if (isName(filter))
+ return this.makeFilter(stream, filter.name, length, params);
+ if (isArray(filter)) {
+ var filterArray = filter;
+ var paramsArray = params;
+ for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+ filter = filterArray[i];
+ if (!isName(filter))
+ error('Bad filter name: ' + filter);
+ else {
+ params = null;
+ if (isArray(paramsArray) && (i in paramsArray))
+ params = paramsArray[i];
+ stream = this.makeFilter(stream, filter.name, length, params);
+ // after the first stream the length variable is invalid
+ length = null;
+ }
+ }
+ }
+ return stream;
+ },
+ makeFilter: function parserMakeFilter(stream, name, length, params) {
+ if (name == 'FlateDecode' || name == 'Fl') {
+ if (params) {
+ return new PredictorStream(new FlateStream(stream), params);
+ }
+ return new FlateStream(stream);
+ } else if (name == 'LZWDecode' || name == 'LZW') {
+ var earlyChange = 1;
+ if (params) {
+ if (params.has('EarlyChange'))
+ earlyChange = params.get('EarlyChange');
+ return new PredictorStream(
+ new LZWStream(stream, earlyChange), params);
+ }
+ return new LZWStream(stream, earlyChange);
+ } else if (name == 'DCTDecode' || name == 'DCT') {
+ var bytes = stream.getBytes(length);
+ return new JpegStream(bytes, stream.dict, this.xref);
+ } else if (name == 'ASCII85Decode' || name == 'A85') {
+ return new Ascii85Stream(stream);
+ } else if (name == 'ASCIIHexDecode' || name == 'AHx') {
+ return new AsciiHexStream(stream);
+ } else if (name == 'CCITTFaxDecode' || name == 'CCF') {
+ return new CCITTFaxStream(stream, params);
+ } else {
+ TODO('filter "' + name + '" not supported yet');
+ }
+ return stream;
+ }
+ };
+
+ return constructor;
+})();
+
+var Lexer = (function lexer() {
+ function constructor(stream) {
+ this.stream = stream;
+ }
+
+ constructor.isSpace = function lexerIsSpace(ch) {
+ return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
+ };
+
+ // A '1' in this array means the character is white space. A '1' or
+ // '2' means the character ends a name or command.
+ var specialChars = [
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
+ 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
+ ];
+
+ function toHexDigit(ch) {
+ if (ch >= '0' && ch <= '9')
+ return ch.charCodeAt(0) - 48;
+ ch = ch.toUpperCase();
+ if (ch >= 'A' && ch <= 'F')
+ return ch.charCodeAt(0) - 55;
+ return -1;
+ }
+
+ constructor.prototype = {
+ getNumber: function lexerGetNumber(ch) {
+ var floating = false;
+ var str = ch;
+ var stream = this.stream;
+ for (;;) {
+ ch = stream.lookChar();
+ if (ch == '.' && !floating) {
+ str += ch;
+ floating = true;
+ } else if (ch == '-') {
+ // ignore minus signs in the middle of numbers to match
+ // Adobe's behavior
+ warn('Badly formated number');
+ } else if (ch >= '0' && ch <= '9') {
+ str += ch;
+ } else if (ch == 'e' || ch == 'E') {
+ floating = true;
+ } else {
+ // the last character doesn't belong to us
+ break;
+ }
+ stream.skip();
+ }
+ var value = parseFloat(str);
+ if (isNaN(value))
+ error('Invalid floating point number: ' + value);
+ return value;
+ },
+ getString: function lexerGetString() {
+ var numParen = 1;
+ var done = false;
+ var str = '';
+ var stream = this.stream;
+ var ch;
+ do {
+ ch = stream.getChar();
+ switch (ch) {
+ case undefined:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case '(':
+ ++numParen;
+ str += ch;
+ break;
+ case ')':
+ if (--numParen == 0) {
+ done = true;
+ } else {
+ str += ch;
+ }
+ break;
+ case '\\':
+ ch = stream.getChar();
+ switch (ch) {
+ case undefined:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case 'n':
+ str += '\n';
+ break;
+ case 'r':
+ str += '\r';
+ break;
+ case 't':
+ str += '\t';
+ break;
+ case 'b':
+ str += '\b';
+ break;
+ case 'f':
+ str += '\f';
+ break;
+ case '\\':
+ case '(':
+ case ')':
+ str += ch;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ var x = ch - '0';
+ ch = stream.lookChar();
+ if (ch >= '0' && ch <= '7') {
+ stream.skip();
+ x = (x << 3) + (ch - '0');
+ ch = stream.lookChar();
+ if (ch >= '0' && ch <= '7') {
+ stream.skip();
+ x = (x << 3) + (ch - '0');
+ }
+ }
+
+ str += String.fromCharCode(x);
+ break;
+ case '\r':
+ ch = stream.lookChar();
+ if (ch == '\n')
+ stream.skip();
+ break;
+ case '\n':
+ break;
+ default:
+ str += ch;
+ }
+ break;
+ default:
+ str += ch;
+ }
+ } while (!done);
+ return str;
+ },
+ getName: function lexerGetName(ch) {
+ var str = '';
+ var stream = this.stream;
+ while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+ stream.skip();
+ if (ch == '#') {
+ ch = stream.lookChar();
+ var x = toHexDigit(ch);
+ if (x != -1) {
+ stream.skip();
+ var x2 = toHexDigit(stream.getChar());
+ if (x2 == -1)
+ error('Illegal digit in hex char in name: ' + x2);
+ str += String.fromCharCode((x << 4) | x2);
+ } else {
+ str += '#';
+ str += ch;
+ }
+ } else {
+ str += ch;
+ }
+ }
+ if (str.length > 128)
+ error('Warning: name token is longer than allowed by the spec: ' +
+ str.length);
+ return new Name(str);
+ },
+ getHexString: function lexerGetHexString(ch) {
+ var str = '';
+ var stream = this.stream;
+ for (;;) {
+ ch = stream.getChar();
+ if (ch == '>') {
+ break;
+ }
+ if (!ch) {
+ warn('Unterminated hex string');
+ break;
+ }
+ if (specialChars[ch.charCodeAt(0)] != 1) {
+ var x, x2;
+ if ((x = toHexDigit(ch)) == -1)
+ error('Illegal character in hex string: ' + ch);
+
+ ch = stream.getChar();
+ while (specialChars[ch.charCodeAt(0)] == 1)
+ ch = stream.getChar();
+
+ if ((x2 = toHexDigit(ch)) == -1)
+ error('Illegal character in hex string: ' + ch);
+
+ str += String.fromCharCode((x << 4) | x2);
+ }
+ }
+ return str;
+ },
+ getObj: function lexerGetObj() {
+ // skip whitespace and comments
+ var comment = false;
+ var stream = this.stream;
+ var ch;
+ while (true) {
+ if (!(ch = stream.getChar()))
+ return EOF;
+ if (comment) {
+ if (ch == '\r' || ch == '\n')
+ comment = false;
+ } else if (ch == '%') {
+ comment = true;
+ } else if (specialChars[ch.charCodeAt(0)] != 1) {
+ break;
+ }
+ }
+
+ // start reading token
+ switch (ch) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '+': case '-': case '.':
+ return this.getNumber(ch);
+ case '(':
+ return this.getString();
+ case '/':
+ return this.getName(ch);
+ // array punctuation
+ case '[':
+ case ']':
+ return new Cmd(ch);
+ // hex string or dict punctuation
+ case '<':
+ ch = stream.lookChar();
+ if (ch == '<') {
+ // dict punctuation
+ stream.skip();
+ return new Cmd('<<');
+ }
+ return this.getHexString(ch);
+ // dict punctuation
+ case '>':
+ ch = stream.lookChar();
+ if (ch == '>') {
+ stream.skip();
+ return new Cmd('>>');
+ }
+ case '{':
+ case '}':
+ return new Cmd(ch);
+ // fall through
+ case ')':
+ error('Illegal character: ' + ch);
+ return Error;
+ }
+
+ // command
+ var str = ch;
+ while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+ stream.skip();
+ if (str.length == 128) {
+ error('Command token too long: ' + str.length);
+ break;
+ }
+ str += ch;
+ }
+ if (str == 'true')
+ return true;
+ if (str == 'false')
+ return false;
+ if (str == 'null')
+ return null;
+ return new Cmd(str);
+ },
+ skipToNextLine: function lexerSkipToNextLine() {
+ var stream = this.stream;
+ while (true) {
+ var ch = stream.getChar();
+ if (!ch || ch == '\n')
+ return;
+ if (ch == '\r') {
+ if ((ch = stream.lookChar()) == '\n')
+ stream.skip();
+ return;
+ }
+ }
+ },
+ skip: function lexerSkip() {
+ this.stream.skip();
+ }
+ };
+
+ return constructor;
+})();
+
+var Linearization = (function linearizationLinearization() {
+ function constructor(stream) {
+ this.parser = new Parser(new Lexer(stream), false);
+ var obj1 = this.parser.getObj();
+ var obj2 = this.parser.getObj();
+ var obj3 = this.parser.getObj();
+ this.linDict = this.parser.getObj();
+ if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
+ isDict(this.linDict)) {
+ var obj = this.linDict.get('Linearized');
+ if (!(isNum(obj) && obj > 0))
+ this.linDict = null;
+ }
+ }
+
+ constructor.prototype = {
+ getInt: function linearizationGetInt(name) {
+ var linDict = this.linDict;
+ var obj;
+ if (isDict(linDict) &&
+ isInt(obj = linDict.get(name)) &&
+ obj > 0) {
+ return obj;
+ }
+ error('"' + name + '" field in linearization table is invalid');
+ return 0;
+ },
+ getHint: function linearizationGetHint(index) {
+ var linDict = this.linDict;
+ var obj1, obj2;
+ if (isDict(linDict) &&
+ isArray(obj1 = linDict.get('H')) &&
+ obj1.length >= 2 &&
+ isInt(obj2 = obj1[index]) &&
+ obj2 > 0) {
+ return obj2;
+ }
+ error('Hints table in linearization table is invalid: ' + index);
+ return 0;
+ },
+ get length() {
+ if (!isDict(this.linDict))
+ return 0;
+ return this.getInt('L');
+ },
+ get hintsOffset() {
+ return this.getHint(0);
+ },
+ get hintsLength() {
+ return this.getHint(1);
+ },
+ get hintsOffset2() {
+ return this.getHint(2);
+ },
+ get hintsLenth2() {
+ return this.getHint(3);
+ },
+ get objectNumberFirst() {
+ return this.getInt('O');
+ },
+ get endFirst() {
+ return this.getInt('E');
+ },
+ get numPages() {
+ return this.getInt('N');
+ },
+ get mainXRefEntriesOffset() {
+ return this.getInt('T');
+ },
+ get pageFirst() {
+ return this.getInt('P');
+ }
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/pattern.js b/apps/files_pdfviewer/js/pdfjs/src/pattern.js
new file mode 100755
index 00000000000..72d13d896b2
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/pattern.js
@@ -0,0 +1,291 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Pattern = (function patternPattern() {
+ // Constructor should define this.getPattern
+ function constructor() {
+ error('should not call Pattern constructor');
+ }
+
+ constructor.prototype = {
+ // Input: current Canvas context
+ // Output: the appropriate fillStyle or strokeStyle
+ getPattern: function pattern_getStyle(ctx) {
+ error('Should not call Pattern.getStyle: ' + ctx);
+ }
+ };
+
+ constructor.shadingFromIR = function pattern_shadingFromIR(ctx, raw) {
+ return Shadings[raw[0]].fromIR(ctx, raw);
+ };
+
+ constructor.parseShading = function pattern_shading(shading, matrix, xref,
+ res, ctx) {
+
+ var dict = isStream(shading) ? shading.dict : shading;
+ var type = dict.get('ShadingType');
+
+ switch (type) {
+ case 2:
+ case 3:
+ // both radial and axial shadings are handled by RadialAxial shading
+ return new Shadings.RadialAxial(dict, matrix, xref, res, ctx);
+ default:
+ return new Shadings.Dummy();
+ }
+ };
+ return constructor;
+})();
+
+var Shadings = {};
+
+// Radial and axial shading have very similar implementations
+// If needed, the implementations can be broken into two classes
+Shadings.RadialAxial = (function radialAxialShading() {
+ function constructor(dict, matrix, xref, res, ctx) {
+ this.matrix = matrix;
+ this.coordsArr = dict.get('Coords');
+ this.shadingType = dict.get('ShadingType');
+ this.type = 'Pattern';
+
+ this.ctx = ctx;
+ var cs = dict.get('ColorSpace', 'CS');
+ cs = ColorSpace.parse(cs, xref, res);
+ this.cs = cs;
+
+ var t0 = 0.0, t1 = 1.0;
+ if (dict.has('Domain')) {
+ var domainArr = dict.get('Domain');
+ t0 = domainArr[0];
+ t1 = domainArr[1];
+ }
+
+ var extendStart = false, extendEnd = false;
+ if (dict.has('Extend')) {
+ var extendArr = dict.get('Extend');
+ extendStart = extendArr[0];
+ extendEnd = extendArr[1];
+ TODO('Support extend');
+ }
+
+ this.extendStart = extendStart;
+ this.extendEnd = extendEnd;
+
+ var fnObj = dict.get('Function');
+ fnObj = xref.fetchIfRef(fnObj);
+ if (isArray(fnObj))
+ error('No support for array of functions');
+ else if (!isPDFFunction(fnObj))
+ error('Invalid function');
+ var fn = PDFFunction.parse(xref, fnObj);
+
+ // 10 samples seems good enough for now, but probably won't work
+ // if there are sharp color changes. Ideally, we would implement
+ // the spec faithfully and add lossless optimizations.
+ var step = (t1 - t0) / 10;
+ var diff = t1 - t0;
+
+ var colorStops = [];
+ for (var i = t0; i <= t1; i += step) {
+ var color = fn([i]);
+ var rgbColor = Util.makeCssRgb.apply(this, cs.getRgb(color));
+ colorStops.push([(i - t0) / diff, rgbColor]);
+ }
+
+ this.colorStops = colorStops;
+ }
+
+ constructor.fromIR = function radialAxialShadingGetIR(ctx, raw) {
+ var type = raw[1];
+ var colorStops = raw[2];
+ var p0 = raw[3];
+ var p1 = raw[4];
+ var r0 = raw[5];
+ var r1 = raw[6];
+
+ var curMatrix = ctx.mozCurrentTransform;
+ if (curMatrix) {
+ var userMatrix = ctx.mozCurrentTransformInverse;
+
+ p0 = Util.applyTransform(p0, curMatrix);
+ p0 = Util.applyTransform(p0, userMatrix);
+
+ p1 = Util.applyTransform(p1, curMatrix);
+ p1 = Util.applyTransform(p1, userMatrix);
+ }
+
+ var grad;
+ if (type == 2)
+ grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+ else if (type == 3)
+ grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+
+ for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+ var c = colorStops[i];
+ grad.addColorStop(c[0], c[1]);
+ }
+ return grad;
+ };
+
+ constructor.prototype = {
+ getIR: function radialAxialShadingGetIR() {
+ var coordsArr = this.coordsArr;
+ var type = this.shadingType;
+ if (type == 2) {
+ var p0 = [coordsArr[0], coordsArr[1]];
+ var p1 = [coordsArr[2], coordsArr[3]];
+ var r0 = null;
+ var r1 = null;
+ } else if (type == 3) {
+ var p0 = [coordsArr[0], coordsArr[1]];
+ var p1 = [coordsArr[3], coordsArr[4]];
+ var r0 = coordsArr[2];
+ var r1 = coordsArr[5];
+ } else {
+ error('getPattern type unknown: ' + type);
+ }
+
+ var matrix = this.matrix;
+ if (matrix) {
+ p0 = Util.applyTransform(p0, matrix);
+ p1 = Util.applyTransform(p1, matrix);
+ }
+
+ return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+ }
+ };
+
+ return constructor;
+})();
+
+Shadings.Dummy = (function dummyShading() {
+ function constructor() {
+ this.type = 'Pattern';
+ }
+
+ constructor.fromIR = function dummyShadingFromIR() {
+ return 'hotpink';
+ };
+
+ constructor.prototype = {
+ getIR: function dummyShadingGetIR() {
+ return ['Dummy'];
+ }
+ };
+ return constructor;
+})();
+
+var TilingPattern = (function tilingPattern() {
+ var PAINT_TYPE_COLORED = 1, PAINT_TYPE_UNCOLORED = 2;
+
+ function TilingPattern(IR, color, ctx, objs) {
+ var IRQueue = IR[2];
+ this.matrix = IR[3];
+ var bbox = IR[4];
+ var xstep = IR[5];
+ var ystep = IR[6];
+ var paintType = IR[7];
+
+ TODO('TilingType');
+
+ this.curMatrix = ctx.mozCurrentTransform;
+ this.invMatrix = ctx.mozCurrentTransformInverse;
+ this.ctx = ctx;
+ this.type = 'Pattern';
+
+ var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
+
+ var topLeft = [x0, y0];
+ // we want the canvas to be as large as the step size
+ var botRight = [x0 + xstep, y0 + ystep];
+
+ var width = botRight[0] - topLeft[0];
+ var height = botRight[1] - topLeft[1];
+
+ // TODO: hack to avoid OOM, we would idealy compute the tiling
+ // pattern to be only as large as the acual size in device space
+ // This could be computed with .mozCurrentTransform, but still
+ // needs to be implemented
+ while (Math.abs(width) > 512 || Math.abs(height) > 512) {
+ width = 512;
+ height = 512;
+ }
+
+ var tmpCanvas = new ScratchCanvas(width, height);
+
+ // set the new canvas element context as the graphics context
+ var tmpCtx = tmpCanvas.getContext('2d');
+ var graphics = new CanvasGraphics(tmpCtx, objs);
+
+ switch (paintType) {
+ case PAINT_TYPE_COLORED:
+ tmpCtx.fillStyle = ctx.fillStyle;
+ tmpCtx.strokeStyle = ctx.strokeStyle;
+ break;
+ case PAINT_TYPE_UNCOLORED:
+ color = Util.makeCssRgb.apply(this, color);
+ tmpCtx.fillStyle = color;
+ tmpCtx.strokeStyle = color;
+ break;
+ default:
+ error('Unsupported paint type: ' + paintType);
+ }
+
+ var scale = [width / xstep, height / ystep];
+ this.scale = scale;
+
+ // transform coordinates to pattern space
+ var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+ var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+ graphics.transform.apply(graphics, tmpScale);
+ graphics.transform.apply(graphics, tmpTranslate);
+
+ if (bbox && isArray(bbox) && 4 == bbox.length) {
+ var bboxWidth = x1 - x0;
+ var bboxHeight = y1 - y0;
+ graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
+ graphics.clip();
+ graphics.endPath();
+ }
+
+ graphics.executeIRQueue(IRQueue);
+
+ this.canvas = tmpCanvas;
+ }
+
+ TilingPattern.getIR = function tiling_getIR(codeIR, dict, args) {
+ var matrix = dict.get('Matrix');
+ var bbox = dict.get('BBox');
+ var xstep = dict.get('XStep');
+ var ystep = dict.get('YStep');
+ var paintType = dict.get('PaintType');
+
+ return [
+ 'TilingPattern', args, codeIR, matrix, bbox, xstep, ystep, paintType
+ ];
+ };
+
+ TilingPattern.prototype = {
+ getPattern: function tiling_getPattern() {
+ var matrix = this.matrix;
+ var curMatrix = this.curMatrix;
+ var ctx = this.ctx;
+
+ if (curMatrix)
+ ctx.setTransform.apply(ctx, curMatrix);
+
+ if (matrix)
+ ctx.transform.apply(ctx, matrix);
+
+ var scale = this.scale;
+ ctx.scale(1 / scale[0], 1 / scale[1]);
+
+ return ctx.createPattern(this.canvas, 'repeat');
+ }
+ };
+
+ return TilingPattern;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/pdf.js b/apps/files_pdfviewer/js/pdfjs/src/pdf.js
new file mode 100755
index 00000000000..1042a651b8d
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/pdf.js
@@ -0,0 +1,15 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+var PDFJS = {};
+
+(function pdfjsWrapper() {
+ // Use strict in our context only - users might not want it
+ 'use strict';
+
+ PDFJS.build = 'PDFJSSCRIPT_BUNDLE_VER';
+
+ // Files are inserted below - see Makefile
+ /* PDFJSSCRIPT_INCLUDE_ALL */
+
+}).call((typeof window === 'undefined') ? this : window);
diff --git a/apps/files_pdfviewer/js/pdfjs/src/stream.js b/apps/files_pdfviewer/js/pdfjs/src/stream.js
new file mode 100755
index 00000000000..559fb2ca22e
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/stream.js
@@ -0,0 +1,2113 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Stream = (function streamStream() {
+ function constructor(arrayBuffer, start, length, dict) {
+ this.bytes = new Uint8Array(arrayBuffer);
+ this.start = start || 0;
+ this.pos = this.start;
+ this.end = (start + length) || this.bytes.length;
+ this.dict = dict;
+ }
+
+ // required methods for a stream. if a particular stream does not
+ // implement these, an error should be thrown
+ constructor.prototype = {
+ get length() {
+ return this.end - this.start;
+ },
+ getByte: function stream_getByte() {
+ if (this.pos >= this.end)
+ return null;
+ return this.bytes[this.pos++];
+ },
+ // returns subarray of original buffer
+ // should only be read
+ getBytes: function stream_getBytes(length) {
+ var bytes = this.bytes;
+ var pos = this.pos;
+ var strEnd = this.end;
+
+ if (!length)
+ return bytes.subarray(pos, strEnd);
+
+ var end = pos + length;
+ if (end > strEnd)
+ end = strEnd;
+
+ this.pos = end;
+ return bytes.subarray(pos, end);
+ },
+ lookChar: function stream_lookChar() {
+ if (this.pos >= this.end)
+ return null;
+ return String.fromCharCode(this.bytes[this.pos]);
+ },
+ getChar: function stream_getChar() {
+ if (this.pos >= this.end)
+ return null;
+ return String.fromCharCode(this.bytes[this.pos++]);
+ },
+ skip: function stream_skip(n) {
+ if (!n)
+ n = 1;
+ this.pos += n;
+ },
+ reset: function stream_reset() {
+ this.pos = this.start;
+ },
+ moveStart: function stream_moveStart() {
+ this.start = this.pos;
+ },
+ makeSubStream: function stream_makeSubstream(start, length, dict) {
+ return new Stream(this.bytes.buffer, start, length, dict);
+ },
+ isStream: true
+ };
+
+ return constructor;
+})();
+
+var StringStream = (function stringStream() {
+ function constructor(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var n = 0; n < length; ++n)
+ bytes[n] = str.charCodeAt(n);
+ Stream.call(this, bytes);
+ }
+
+ constructor.prototype = Stream.prototype;
+
+ return constructor;
+})();
+
+// super class for the decoding streams
+var DecodeStream = (function decodeStream() {
+ function constructor() {
+ this.pos = 0;
+ this.bufferLength = 0;
+ this.eof = false;
+ this.buffer = null;
+ }
+
+ constructor.prototype = {
+ ensureBuffer: function decodestream_ensureBuffer(requested) {
+ var buffer = this.buffer;
+ var current = buffer ? buffer.byteLength : 0;
+ if (requested < current)
+ return buffer;
+ var size = 512;
+ while (size < requested)
+ size <<= 1;
+ var buffer2 = new Uint8Array(size);
+ for (var i = 0; i < current; ++i)
+ buffer2[i] = buffer[i];
+ return (this.buffer = buffer2);
+ },
+ getByte: function decodestream_getByte() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return this.buffer[this.pos++];
+ },
+ getBytes: function decodestream_getBytes(length) {
+ var end, pos = this.pos;
+
+ if (length) {
+ this.ensureBuffer(pos + length);
+ end = pos + length;
+
+ while (!this.eof && this.bufferLength < end)
+ this.readBlock();
+
+ var bufEnd = this.bufferLength;
+ if (end > bufEnd)
+ end = bufEnd;
+ } else {
+ while (!this.eof)
+ this.readBlock();
+
+ end = this.bufferLength;
+
+ // checking if bufferLength is still 0 then
+ // the buffer has to be initialized
+ if (!end)
+ this.buffer = new Uint8Array(0);
+ }
+
+ this.pos = end;
+ return this.buffer.subarray(pos, end);
+ },
+ lookChar: function decodestream_lookChar() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return String.fromCharCode(this.buffer[this.pos]);
+ },
+ getChar: function decodestream_getChar() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof)
+ return null;
+ this.readBlock();
+ }
+ return String.fromCharCode(this.buffer[this.pos++]);
+ },
+ makeSubStream: function decodestream_makeSubstream(start, length, dict) {
+ var end = start + length;
+ while (this.bufferLength <= end && !this.eof)
+ this.readBlock();
+ return new Stream(this.buffer, start, length, dict);
+ },
+ skip: function decodestream_skip(n) {
+ if (!n)
+ n = 1;
+ this.pos += n;
+ },
+ reset: function decodestream_reset() {
+ this.pos = 0;
+ }
+ };
+
+ return constructor;
+})();
+
+var FakeStream = (function fakeStream() {
+ function constructor(stream) {
+ this.dict = stream.dict;
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+ constructor.prototype.readBlock = function fakeStreamReadBlock() {
+ var bufferLength = this.bufferLength;
+ bufferLength += 1024;
+ var buffer = this.ensureBuffer(bufferLength);
+ this.bufferLength = bufferLength;
+ };
+
+ constructor.prototype.getBytes = function fakeStreamGetBytes(length) {
+ var end, pos = this.pos;
+
+ if (length) {
+ this.ensureBuffer(pos + length);
+ end = pos + length;
+
+ while (!this.eof && this.bufferLength < end)
+ this.readBlock();
+
+ var bufEnd = this.bufferLength;
+ if (end > bufEnd)
+ end = bufEnd;
+ } else {
+ this.eof = true;
+ end = this.bufferLength;
+ }
+
+ this.pos = end;
+ return this.buffer.subarray(pos, end);
+ };
+
+ return constructor;
+})();
+
+var StreamsSequenceStream = (function streamSequenceStream() {
+ function constructor(streams) {
+ this.streams = streams;
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function streamSequenceStreamReadBlock() {
+ var streams = this.streams;
+ if (streams.length == 0) {
+ this.eof = true;
+ return;
+ }
+ var stream = streams.shift();
+ var chunk = stream.getBytes();
+ var bufferLength = this.bufferLength;
+ var newLength = bufferLength + chunk.length;
+ var buffer = this.ensureBuffer(newLength);
+ buffer.set(chunk, bufferLength);
+ this.bufferLength = newLength;
+ };
+
+ return constructor;
+})();
+
+var FlateStream = (function flateStream() {
+ var codeLenCodeMap = new Uint32Array([
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+ ]);
+
+ var lengthDecode = new Uint32Array([
+ 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+ 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+ 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+ 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+ ]);
+
+ var distDecode = new Uint32Array([
+ 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+ 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+ 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+ 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+ ]);
+
+ var fixedLitCodeTab = [new Uint32Array([
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+ 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+ 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+ 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+ 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+ 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+ 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+ 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+ 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+ 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+ 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+ 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+ 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+ 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+ 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+ 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+ 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+ 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+ 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+ 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+ 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+ 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+ 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+ 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+ 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+ 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+ 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+ 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+ 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+ 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+ 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+ 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+ 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+ 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+ 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+ 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+ 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+ 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+ 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+ 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+ 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+ ]), 9];
+
+ var fixedDistCodeTab = [new Uint32Array([
+ 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+ 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+ 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+ 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+ ]), 5];
+
+ function constructor(stream) {
+ var bytes = stream.getBytes();
+ var bytesPos = 0;
+
+ this.dict = stream.dict;
+ var cmf = bytes[bytesPos++];
+ var flg = bytes[bytesPos++];
+ if (cmf == -1 || flg == -1)
+ error('Invalid header in flate stream: ' + cmf + ', ' + flg);
+ if ((cmf & 0x0f) != 0x08)
+ error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+ if ((((cmf << 8) + flg) % 31) != 0)
+ error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+ if (flg & 0x20)
+ error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+
+ this.bytes = bytes;
+ this.bytesPos = bytesPos;
+
+ this.codeSize = 0;
+ this.codeBuf = 0;
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.getBits = function flateStreamGetBits(bits) {
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+
+ var b;
+ while (codeSize < bits) {
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad encoding in flate stream');
+ codeBuf |= b << codeSize;
+ codeSize += 8;
+ }
+ b = codeBuf & ((1 << bits) - 1);
+ this.codeBuf = codeBuf >> bits;
+ this.codeSize = codeSize -= bits;
+ this.bytesPos = bytesPos;
+ return b;
+ };
+
+ constructor.prototype.getCode = function flateStreamGetCode(table) {
+ var codes = table[0];
+ var maxLen = table[1];
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+
+ while (codeSize < maxLen) {
+ var b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad encoding in flate stream');
+ codeBuf |= (b << codeSize);
+ codeSize += 8;
+ }
+ var code = codes[codeBuf & ((1 << maxLen) - 1)];
+ var codeLen = code >> 16;
+ var codeVal = code & 0xffff;
+ if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
+ error('Bad encoding in flate stream');
+ this.codeBuf = (codeBuf >> codeLen);
+ this.codeSize = (codeSize - codeLen);
+ this.bytesPos = bytesPos;
+ return codeVal;
+ };
+
+ constructor.prototype.generateHuffmanTable =
+ function flateStreamGenerateHuffmanTable(lengths) {
+ var n = lengths.length;
+
+ // find max code length
+ var maxLen = 0;
+ for (var i = 0; i < n; ++i) {
+ if (lengths[i] > maxLen)
+ maxLen = lengths[i];
+ }
+
+ // build the table
+ var size = 1 << maxLen;
+ var codes = new Uint32Array(size);
+ for (var len = 1, code = 0, skip = 2;
+ len <= maxLen;
+ ++len, code <<= 1, skip <<= 1) {
+ for (var val = 0; val < n; ++val) {
+ if (lengths[val] == len) {
+ // bit-reverse the code
+ var code2 = 0;
+ var t = code;
+ for (var i = 0; i < len; ++i) {
+ code2 = (code2 << 1) | (t & 1);
+ t >>= 1;
+ }
+
+ // fill the table entries
+ for (var i = code2; i < size; i += skip)
+ codes[i] = (len << 16) | val;
+
+ ++code;
+ }
+ }
+ }
+
+ return [codes, maxLen];
+ };
+
+ constructor.prototype.readBlock = function flateStreamReadBlock() {
+ // read block header
+ var hdr = this.getBits(3);
+ if (hdr & 1)
+ this.eof = true;
+ hdr >>= 1;
+
+ if (hdr == 0) { // uncompressed block
+ var bytes = this.bytes;
+ var bytesPos = this.bytesPos;
+ var b;
+
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ var blockLen = b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ blockLen |= (b << 8);
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ var check = b;
+ if (typeof (b = bytes[bytesPos++]) == 'undefined')
+ error('Bad block header in flate stream');
+ check |= (b << 8);
+ if (check != (~blockLen & 0xffff))
+ error('Bad uncompressed block length in flate stream');
+
+ this.codeBuf = 0;
+ this.codeSize = 0;
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + blockLen);
+ var end = bufferLength + blockLen;
+ this.bufferLength = end;
+ for (var n = bufferLength; n < end; ++n) {
+ if (typeof (b = bytes[bytesPos++]) == 'undefined') {
+ this.eof = true;
+ break;
+ }
+ buffer[n] = b;
+ }
+ this.bytesPos = bytesPos;
+ return;
+ }
+
+ var litCodeTable;
+ var distCodeTable;
+ if (hdr == 1) { // compressed block, fixed codes
+ litCodeTable = fixedLitCodeTab;
+ distCodeTable = fixedDistCodeTab;
+ } else if (hdr == 2) { // compressed block, dynamic codes
+ var numLitCodes = this.getBits(5) + 257;
+ var numDistCodes = this.getBits(5) + 1;
+ var numCodeLenCodes = this.getBits(4) + 4;
+
+ // build the code lengths code table
+ var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+
+ for (var i = 0; i < numCodeLenCodes; ++i)
+ codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+ var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+ // build the literal and distance code tables
+ var len = 0;
+ var i = 0;
+ var codes = numLitCodes + numDistCodes;
+ var codeLengths = new Uint8Array(codes);
+ while (i < codes) {
+ var code = this.getCode(codeLenCodeTab);
+ if (code == 16) {
+ var bitsLength = 2, bitsOffset = 3, what = len;
+ } else if (code == 17) {
+ var bitsLength = 3, bitsOffset = 3, what = (len = 0);
+ } else if (code == 18) {
+ var bitsLength = 7, bitsOffset = 11, what = (len = 0);
+ } else {
+ codeLengths[i++] = len = code;
+ continue;
+ }
+
+ var repeatLength = this.getBits(bitsLength) + bitsOffset;
+ while (repeatLength-- > 0)
+ codeLengths[i++] = what;
+ }
+
+ litCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+ distCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+ } else {
+ error('Unknown block type in flate stream');
+ }
+
+ var buffer = this.buffer;
+ var limit = buffer ? buffer.length : 0;
+ var pos = this.bufferLength;
+ while (true) {
+ var code1 = this.getCode(litCodeTable);
+ if (code1 < 256) {
+ if (pos + 1 >= limit) {
+ buffer = this.ensureBuffer(pos + 1);
+ limit = buffer.length;
+ }
+ buffer[pos++] = code1;
+ continue;
+ }
+ if (code1 == 256) {
+ this.bufferLength = pos;
+ return;
+ }
+ code1 -= 257;
+ code1 = lengthDecode[code1];
+ var code2 = code1 >> 16;
+ if (code2 > 0)
+ code2 = this.getBits(code2);
+ var len = (code1 & 0xffff) + code2;
+ code1 = this.getCode(distCodeTable);
+ code1 = distDecode[code1];
+ code2 = code1 >> 16;
+ if (code2 > 0)
+ code2 = this.getBits(code2);
+ var dist = (code1 & 0xffff) + code2;
+ if (pos + len >= limit) {
+ buffer = this.ensureBuffer(pos + len);
+ limit = buffer.length;
+ }
+ for (var k = 0; k < len; ++k, ++pos)
+ buffer[pos] = buffer[pos - dist];
+ }
+ };
+
+ return constructor;
+})();
+
+var PredictorStream = (function predictorStream() {
+ function constructor(stream, params) {
+ var predictor = this.predictor = params.get('Predictor') || 1;
+
+ if (predictor <= 1)
+ return stream; // no prediction
+ if (predictor !== 2 && (predictor < 10 || predictor > 15))
+ error('Unsupported predictor: ' + predictor);
+
+ if (predictor === 2)
+ this.readBlock = this.readBlockTiff;
+ else
+ this.readBlock = this.readBlockPng;
+
+ this.stream = stream;
+ this.dict = stream.dict;
+
+ var colors = this.colors = params.get('Colors') || 1;
+ var bits = this.bits = params.get('BitsPerComponent') || 8;
+ var columns = this.columns = params.get('Columns') || 1;
+
+ this.pixBytes = (colors * bits + 7) >> 3;
+ this.rowBytes = (columns * colors * bits + 7) >> 3;
+
+ DecodeStream.call(this);
+ return this;
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlockTiff =
+ function predictorStreamReadBlockTiff() {
+ var rowBytes = this.rowBytes;
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+ var currentRow = buffer.subarray(bufferLength, bufferLength + rowBytes);
+
+ var bits = this.bits;
+ var colors = this.colors;
+
+ var rawBytes = this.stream.getBytes(rowBytes);
+
+ var inbuf = 0, outbuf = 0;
+ var inbits = 0, outbits = 0;
+
+ if (bits === 1) {
+ for (var i = 0; i < rowBytes; ++i) {
+ var c = rawBytes[i];
+ inbuf = (inbuf << 8) | c;
+ // bitwise addition is exclusive or
+ // first shift inbuf and then add
+ currentRow[i] = (c ^ (inbuf >> colors)) & 0xFF;
+ // truncate inbuf (assumes colors < 16)
+ inbuf &= 0xFFFF;
+ }
+ } else if (bits === 8) {
+ for (var i = 0; i < colors; ++i)
+ currentRow[i] = rawBytes[i];
+ for (; i < rowBytes; ++i)
+ currentRow[i] = currentRow[i - colors] + rawBytes[i];
+ } else {
+ var compArray = new Uint8Array(colors + 1);
+ var bitMask = (1 << bits) - 1;
+ var j = 0, k = 0;
+ var columns = this.columns;
+ for (var i = 0; i < columns; ++i) {
+ for (var kk = 0; kk < colors; ++kk) {
+ if (inbits < bits) {
+ inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
+ inbits += 8;
+ }
+ compArray[kk] = (compArray[kk] +
+ (inbuf >> (inbits - bits))) & bitMask;
+ inbits -= bits;
+ outbuf = (outbuf << bits) | compArray[kk];
+ outbits += bits;
+ if (outbits >= 8) {
+ currentRow[k++] = (outbuf >> (outbits - 8)) & 0xFF;
+ outbits -= 8;
+ }
+ }
+ }
+ if (outbits > 0) {
+ currentRow[k++] = (outbuf << (8 - outbits)) +
+ (inbuf & ((1 << (8 - outbits)) - 1));
+ }
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ constructor.prototype.readBlockPng = function predictorStreamReadBlockPng() {
+ var rowBytes = this.rowBytes;
+ var pixBytes = this.pixBytes;
+
+ var predictor = this.stream.getByte();
+ var rawBytes = this.stream.getBytes(rowBytes);
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+ var currentRow = buffer.subarray(bufferLength, bufferLength + rowBytes);
+ var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+ if (prevRow.length == 0)
+ prevRow = new Uint8Array(rowBytes);
+
+ switch (predictor) {
+ case 0:
+ for (var i = 0; i < rowBytes; ++i)
+ currentRow[i] = rawBytes[i];
+ break;
+ case 1:
+ for (var i = 0; i < pixBytes; ++i)
+ currentRow[i] = rawBytes[i];
+ for (; i < rowBytes; ++i)
+ currentRow[i] = (currentRow[i - pixBytes] + rawBytes[i]) & 0xFF;
+ break;
+ case 2:
+ for (var i = 0; i < rowBytes; ++i)
+ currentRow[i] = (prevRow[i] + rawBytes[i]) & 0xFF;
+ break;
+ case 3:
+ for (var i = 0; i < pixBytes; ++i)
+ currentRow[i] = (prevRow[i] >> 1) + rawBytes[i];
+ for (; i < rowBytes; ++i) {
+ currentRow[i] = (((prevRow[i] + currentRow[i - pixBytes]) >> 1) +
+ rawBytes[i]) & 0xFF;
+ }
+ break;
+ case 4:
+ // we need to save the up left pixels values. the simplest way
+ // is to create a new buffer
+ for (var i = 0; i < pixBytes; ++i) {
+ var up = prevRow[i];
+ var c = rawBytes[i];
+ currentRow[i] = up + c;
+ }
+ for (; i < rowBytes; ++i) {
+ var up = prevRow[i];
+ var upLeft = prevRow[i - pixBytes];
+ var left = currentRow[i - pixBytes];
+ var p = left + up - upLeft;
+
+ var pa = p - left;
+ if (pa < 0)
+ pa = -pa;
+ var pb = p - up;
+ if (pb < 0)
+ pb = -pb;
+ var pc = p - upLeft;
+ if (pc < 0)
+ pc = -pc;
+
+ var c = rawBytes[i];
+ if (pa <= pb && pa <= pc)
+ currentRow[i] = left + c;
+ else if (pb <= pc)
+ currentRow[i] = up + c;
+ else
+ currentRow[i] = upLeft + c;
+ }
+ break;
+ default:
+ error('Unsupported predictor: ' + predictor);
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ return constructor;
+})();
+
+/**
+ * Depending on the type of JPEG a JpegStream is handled in different ways. For
+ * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
+ * data is stored and then loaded by the browser. For unsupported JPEG's we use
+ * a library to decode these images and the stream behaves like all the other
+ * DecodeStreams.
+ */
+var JpegStream = (function jpegStream() {
+ function isAdobeImage(bytes) {
+ var maxBytesScanned = Math.max(bytes.length - 16, 1024);
+ // Looking for APP14, 'Adobe'
+ for (var i = 0; i < maxBytesScanned; ++i) {
+ if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
+ bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
+ bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
+ bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
+ bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
+ return true;
+ // scanning until frame tag
+ if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
+ break;
+ }
+ return false;
+ }
+
+ function fixAdobeImage(bytes) {
+ // Inserting 'EMBED' marker after JPEG signature
+ var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
+ 0x44, 0]);
+ var newBytes = new Uint8Array(bytes.length + embedMarker.length);
+ newBytes.set(bytes, embedMarker.length);
+ // copy JPEG header
+ newBytes[0] = bytes[0];
+ newBytes[1] = bytes[1];
+ newBytes.set(embedMarker, 2);
+ return newBytes;
+ }
+
+ function constructor(bytes, dict, xref) {
+ // TODO: per poppler, some images may have 'junk' before that
+ // need to be removed
+ this.dict = dict;
+
+ // Flag indicating wether the image can be natively loaded.
+ this.isNative = true;
+
+ this.colorTransform = -1;
+
+ if (isAdobeImage(bytes)) {
+ // when bug 674619 land, let's check if browser can do
+ // normal cmyk and then we won't have to the following
+ var cs = xref.fetchIfRef(dict.get('ColorSpace'));
+
+ // DeviceRGB and DeviceGray are the only Adobe images that work natively
+ if (isName(cs) && (cs.name === 'DeviceRGB' || cs.name === 'DeviceGray')) {
+ bytes = fixAdobeImage(bytes);
+ this.src = bytesToString(bytes);
+ } else {
+ this.colorTransform = dict.get('ColorTransform');
+ this.isNative = false;
+ this.bytes = bytes;
+ }
+ } else {
+ this.src = bytesToString(bytes);
+ }
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) {
+ if (this.bufferLength)
+ return;
+ var jpegImage = new JpegImage();
+ jpegImage.colorTransform = this.colorTransform;
+ jpegImage.parse(this.bytes);
+ var width = jpegImage.width;
+ var height = jpegImage.height;
+ var data = jpegImage.getData(width, height);
+ this.buffer = data;
+ this.bufferLength = data.length;
+ };
+ constructor.prototype.getIR = function jpegStreamGetIR() {
+ return this.src;
+ };
+ constructor.prototype.getChar = function jpegStreamGetChar() {
+ error('internal error: getChar is not valid on JpegStream');
+ };
+
+ return constructor;
+})();
+
+var DecryptStream = (function decryptStream() {
+ function constructor(str, decrypt) {
+ this.str = str;
+ this.dict = str.dict;
+ this.decrypt = decrypt;
+
+ DecodeStream.call(this);
+ }
+
+ var chunkSize = 512;
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function decryptStreamReadBlock() {
+ var chunk = this.str.getBytes(chunkSize);
+ if (!chunk || chunk.length == 0) {
+ this.eof = true;
+ return;
+ }
+ var decrypt = this.decrypt;
+ chunk = decrypt(chunk);
+
+ var bufferLength = this.bufferLength;
+ var i, n = chunk.length;
+ var buffer = this.ensureBuffer(bufferLength + n);
+ for (i = 0; i < n; i++)
+ buffer[bufferLength++] = chunk[i];
+ this.bufferLength = bufferLength;
+ };
+
+ return constructor;
+})();
+
+var Ascii85Stream = (function ascii85Stream() {
+ function constructor(str) {
+ this.str = str;
+ this.dict = str.dict;
+ this.input = new Uint8Array(5);
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function ascii85StreamReadBlock() {
+ var tildaCode = '~'.charCodeAt(0);
+ var zCode = 'z'.charCodeAt(0);
+ var str = this.str;
+
+ var c = str.getByte();
+ while (Lexer.isSpace(String.fromCharCode(c)))
+ c = str.getByte();
+
+ if (!c || c === tildaCode) {
+ this.eof = true;
+ return;
+ }
+
+ var bufferLength = this.bufferLength, buffer;
+
+ // special code for z
+ if (c == zCode) {
+ buffer = this.ensureBuffer(bufferLength + 4);
+ for (var i = 0; i < 4; ++i)
+ buffer[bufferLength + i] = 0;
+ this.bufferLength += 4;
+ } else {
+ var input = this.input;
+ input[0] = c;
+ for (var i = 1; i < 5; ++i) {
+ c = str.getByte();
+ while (Lexer.isSpace(String.fromCharCode(c)))
+ c = str.getByte();
+
+ input[i] = c;
+
+ if (!c || c == tildaCode)
+ break;
+ }
+ buffer = this.ensureBuffer(bufferLength + i - 1);
+ this.bufferLength += i - 1;
+
+ // partial ending;
+ if (i < 5) {
+ for (; i < 5; ++i)
+ input[i] = 0x21 + 84;
+ this.eof = true;
+ }
+ var t = 0;
+ for (var i = 0; i < 5; ++i)
+ t = t * 85 + (input[i] - 0x21);
+
+ for (var i = 3; i >= 0; --i) {
+ buffer[bufferLength + i] = t & 0xFF;
+ t >>= 8;
+ }
+ }
+ };
+
+ return constructor;
+})();
+
+var AsciiHexStream = (function asciiHexStream() {
+ function constructor(str) {
+ this.str = str;
+ this.dict = str.dict;
+
+ DecodeStream.call(this);
+ }
+
+ var hexvalueMap = {
+ 9: -1, // \t
+ 32: -1, // space
+ 48: 0,
+ 49: 1,
+ 50: 2,
+ 51: 3,
+ 52: 4,
+ 53: 5,
+ 54: 6,
+ 55: 7,
+ 56: 8,
+ 57: 9,
+ 65: 10,
+ 66: 11,
+ 67: 12,
+ 68: 13,
+ 69: 14,
+ 70: 15,
+ 97: 10,
+ 98: 11,
+ 99: 12,
+ 100: 13,
+ 101: 14,
+ 102: 15
+ };
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function asciiHexStreamReadBlock() {
+ var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
+ decodeLength, buffer, bufferLength, i, length;
+
+ decodeLength = (bytes.length + 1) >> 1;
+ buffer = this.ensureBuffer(this.bufferLength + decodeLength);
+ bufferLength = this.bufferLength;
+
+ for (i = 0, length = bytes.length; i < length; i++) {
+ c = hexvalueMap[bytes[i]];
+ while (c == -1 && (i + 1) < length) {
+ c = hexvalueMap[bytes[++i]];
+ }
+
+ if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
+ n = hexvalueMap[bytes[++i]];
+ buffer[bufferLength++] = c * 16 + n;
+ } else {
+ // EOD marker at an odd number, behave as if a 0 followed the last
+ // digit.
+ if (bytes[i] !== gtCode) {
+ buffer[bufferLength++] = c * 16;
+ }
+ }
+ }
+
+ this.bufferLength = bufferLength;
+ this.eof = true;
+ };
+
+ return constructor;
+})();
+
+var CCITTFaxStream = (function ccittFaxStream() {
+
+ var ccittEOL = -2;
+ var twoDimPass = 0;
+ var twoDimHoriz = 1;
+ var twoDimVert0 = 2;
+ var twoDimVertR1 = 3;
+ var twoDimVertL1 = 4;
+ var twoDimVertR2 = 5;
+ var twoDimVertL2 = 6;
+ var twoDimVertR3 = 7;
+ var twoDimVertL3 = 8;
+
+ var twoDimTable = [
+ [-1, -1], [-1, -1], // 000000x
+ [7, twoDimVertL3], // 0000010
+ [7, twoDimVertR3], // 0000011
+ [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
+ [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
+ [4, twoDimPass], [4, twoDimPass], // 0001xxx
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0]
+ ];
+
+ var whiteTable1 = [
+ [-1, -1], // 00000
+ [12, ccittEOL], // 00001
+ [-1, -1], [-1, -1], // 0001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
+ [11, 1792], [11, 1792], // 1000x
+ [12, 1984], // 10010
+ [12, 2048], // 10011
+ [12, 2112], // 10100
+ [12, 2176], // 10101
+ [12, 2240], // 10110
+ [12, 2304], // 10111
+ [11, 1856], [11, 1856], // 1100x
+ [11, 1920], [11, 1920], // 1101x
+ [12, 2368], // 11100
+ [12, 2432], // 11101
+ [12, 2496], // 11110
+ [12, 2560] // 11111
+ ];
+
+ var whiteTable2 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx
+ [8, 29], [8, 29], // 00000010x
+ [8, 30], [8, 30], // 00000011x
+ [8, 45], [8, 45], // 00000100x
+ [8, 46], [8, 46], // 00000101x
+ [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx
+ [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx
+ [8, 47], [8, 47], // 00001010x
+ [8, 48], [8, 48], // 00001011x
+ [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx
+ [6, 13], [6, 13], [6, 13], [6, 13],
+ [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx
+ [8, 33], [8, 33], // 00010010x
+ [8, 34], [8, 34], // 00010011x
+ [8, 35], [8, 35], // 00010100x
+ [8, 36], [8, 36], // 00010101x
+ [8, 37], [8, 37], // 00010110x
+ [8, 38], [8, 38], // 00010111x
+ [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx
+ [8, 31], [8, 31], // 00011010x
+ [8, 32], [8, 32], // 00011011x
+ [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx
+ [6, 1], [6, 1], [6, 1], [6, 1],
+ [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx
+ [6, 12], [6, 12], [6, 12], [6, 12],
+ [8, 53], [8, 53], // 00100100x
+ [8, 54], [8, 54], // 00100101x
+ [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx
+ [8, 39], [8, 39], // 00101000x
+ [8, 40], [8, 40], // 00101001x
+ [8, 41], [8, 41], // 00101010x
+ [8, 42], [8, 42], // 00101011x
+ [8, 43], [8, 43], // 00101100x
+ [8, 44], [8, 44], // 00101101x
+ [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx
+ [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx
+ [8, 61], [8, 61], // 00110010x
+ [8, 62], [8, 62], // 00110011x
+ [8, 63], [8, 63], // 00110100x
+ [8, 0], [8, 0], // 00110101x
+ [8, 320], [8, 320], // 00110110x
+ [8, 384], [8, 384], // 00110111x
+ [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx
+ [8, 59], [8, 59], // 01001010x
+ [8, 60], [8, 60], // 01001011x
+ [9, 1472], // 010011000
+ [9, 1536], // 010011001
+ [9, 1600], // 010011010
+ [9, 1728], // 010011011
+ [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx
+ [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx
+ [8, 49], [8, 49], // 01010010x
+ [8, 50], [8, 50], // 01010011x
+ [8, 51], [8, 51], // 01010100x
+ [8, 52], [8, 52], // 01010101x
+ [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx
+ [8, 55], [8, 55], // 01011000x
+ [8, 56], [8, 56], // 01011001x
+ [8, 57], [8, 57], // 01011010x
+ [8, 58], [8, 58], // 01011011x
+ [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx
+ [6, 192], [6, 192], [6, 192], [6, 192],
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664],
+ [8, 448], [8, 448], // 01100100x
+ [8, 512], [8, 512], // 01100101x
+ [9, 704], // 011001100
+ [9, 768], // 011001101
+ [8, 640], [8, 640], // 01100111x
+ [8, 576], [8, 576], // 01101000x
+ [9, 832], // 011010010
+ [9, 896], // 011010011
+ [9, 960], // 011010100
+ [9, 1024], // 011010101
+ [9, 1088], // 011010110
+ [9, 1152], // 011010111
+ [9, 1216], // 011011000
+ [9, 1280], // 011011001
+ [9, 1344], // 011011010
+ [9, 1408], // 011011011
+ [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx
+ [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx
+ [6, 16], [6, 16], [6, 16], [6, 16],
+ [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx
+ [6, 17], [6, 17], [6, 17], [6, 17],
+ [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx
+ [6, 14], [6, 14], [6, 14], [6, 14],
+ [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx
+ [6, 15], [6, 15], [6, 15], [6, 15],
+ [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7]
+ ];
+
+ var blackTable1 = [
+ [-1, -1], [-1, -1], // 000000000000x
+ [12, ccittEOL], [12, ccittEOL], // 000000000001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx
+ [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
+ [12, 1984], [12, 1984], // 000000010010x
+ [12, 2048], [12, 2048], // 000000010011x
+ [12, 2112], [12, 2112], // 000000010100x
+ [12, 2176], [12, 2176], // 000000010101x
+ [12, 2240], [12, 2240], // 000000010110x
+ [12, 2304], [12, 2304], // 000000010111x
+ [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
+ [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
+ [12, 2368], [12, 2368], // 000000011100x
+ [12, 2432], [12, 2432], // 000000011101x
+ [12, 2496], [12, 2496], // 000000011110x
+ [12, 2560], [12, 2560], // 000000011111x
+ [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx
+ [10, 18], [10, 18], [10, 18], [10, 18],
+ [12, 52], [12, 52], // 000000100100x
+ [13, 640], // 0000001001010
+ [13, 704], // 0000001001011
+ [13, 768], // 0000001001100
+ [13, 832], // 0000001001101
+ [12, 55], [12, 55], // 000000100111x
+ [12, 56], [12, 56], // 000000101000x
+ [13, 1280], // 0000001010010
+ [13, 1344], // 0000001010011
+ [13, 1408], // 0000001010100
+ [13, 1472], // 0000001010101
+ [12, 59], [12, 59], // 000000101011x
+ [12, 60], [12, 60], // 000000101100x
+ [13, 1536], // 0000001011010
+ [13, 1600], // 0000001011011
+ [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx
+ [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx
+ [13, 1664], // 0000001100100
+ [13, 1728], // 0000001100101
+ [12, 320], [12, 320], // 000000110011x
+ [12, 384], [12, 384], // 000000110100x
+ [12, 448], [12, 448], // 000000110101x
+ [13, 512], // 0000001101100
+ [13, 576], // 0000001101101
+ [12, 53], [12, 53], // 000000110111x
+ [12, 54], [12, 54], // 000000111000x
+ [13, 896], // 0000001110010
+ [13, 960], // 0000001110011
+ [13, 1024], // 0000001110100
+ [13, 1088], // 0000001110101
+ [13, 1152], // 0000001110110
+ [13, 1216], // 0000001110111
+ [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx
+ [10, 64], [10, 64], [10, 64], [10, 64]
+ ];
+
+ var blackTable2 = [
+ [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [11, 23], [11, 23], // 00000101000x
+ [12, 50], // 000001010010
+ [12, 51], // 000001010011
+ [12, 44], // 000001010100
+ [12, 45], // 000001010101
+ [12, 46], // 000001010110
+ [12, 47], // 000001010111
+ [12, 57], // 000001011000
+ [12, 58], // 000001011001
+ [12, 61], // 000001011010
+ [12, 256], // 000001011011
+ [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
+ [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
+ [12, 48], // 000001100100
+ [12, 49], // 000001100101
+ [12, 62], // 000001100110
+ [12, 63], // 000001100111
+ [12, 30], // 000001101000
+ [12, 31], // 000001101001
+ [12, 32], // 000001101010
+ [12, 33], // 000001101011
+ [12, 40], // 000001101100
+ [12, 41], // 000001101101
+ [11, 22], [11, 22], // 00000110111x
+ [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx
+ [9, 15], [9, 15], [9, 15], [9, 15],
+ [12, 128], // 000011001000
+ [12, 192], // 000011001001
+ [12, 26], // 000011001010
+ [12, 27], // 000011001011
+ [12, 28], // 000011001100
+ [12, 29], // 000011001101
+ [11, 19], [11, 19], // 00001100111x
+ [11, 20], [11, 20], // 00001101000x
+ [12, 34], // 000011010010
+ [12, 35], // 000011010011
+ [12, 36], // 000011010100
+ [12, 37], // 000011010101
+ [12, 38], // 000011010110
+ [12, 39], // 000011010111
+ [11, 21], [11, 21], // 00001101100x
+ [12, 42], // 000011011010
+ [12, 43], // 000011011011
+ [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx
+ [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12]
+ ];
+
+ var blackTable3 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
+ [6, 9], // 000100
+ [6, 8], // 000101
+ [5, 7], [5, 7], // 00011x
+ [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx
+ [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx
+ [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx
+ [3, 1], [3, 1], [3, 1], [3, 1],
+ [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx
+ [3, 4], [3, 4], [3, 4], [3, 4],
+ [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2]
+ ];
+
+ function constructor(str, params) {
+ this.str = str;
+ this.dict = str.dict;
+
+ params = params || new Dict();
+
+ this.encoding = params.get('K') || 0;
+ this.eoline = params.get('EndOfLine') || false;
+ this.byteAlign = params.get('EncodedByteAlign') || false;
+ this.columns = params.get('Columns') || 1728;
+ this.rows = params.get('Rows') || 0;
+ var eoblock = params.get('EndOfBlock');
+ if (eoblock == null)
+ eoblock = true;
+ this.eoblock = eoblock;
+ this.black = params.get('BlackIs1') || false;
+
+ this.codingLine = new Uint32Array(this.columns + 1);
+ this.refLine = new Uint32Array(this.columns + 2);
+
+ this.codingLine[0] = this.columns;
+ this.codingPos = 0;
+
+ this.row = 0;
+ this.nextLine2D = this.encoding < 0;
+ this.inputBits = 0;
+ this.inputBuf = 0;
+ this.outputBits = 0;
+ this.buf = EOF;
+
+ var code1;
+ while ((code1 = this.lookBits(12)) == 0) {
+ this.eatBits(1);
+ }
+ if (code1 == 1) {
+ this.eatBits(12);
+ }
+ if (this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBlock = function ccittFaxStreamReadBlock() {
+ while (!this.eof) {
+ var c = this.lookChar();
+ this.buf = EOF;
+ this.ensureBuffer(this.bufferLength + 1);
+ this.buffer[this.bufferLength++] = c;
+ }
+ };
+
+ constructor.prototype.addPixels =
+ function ccittFaxStreamAddPixels(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ warn('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels) {
+ ++codingPos;
+ }
+
+ codingLine[codingPos] = a1;
+ }
+ this.codingPos = codingPos;
+ };
+
+ constructor.prototype.addPixelsNeg =
+ function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ warn('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels)
+ ++codingPos;
+
+ codingLine[codingPos] = a1;
+ } else if (a1 < codingLine[codingPos]) {
+ if (a1 < 0) {
+ warn('invalid code');
+ this.err = true;
+ a1 = 0;
+ }
+ while (codingPos > 0 && a1 < codingLine[codingPos - 1])
+ --codingPos;
+ codingLine[codingPos] = a1;
+ }
+
+ this.codingPos = codingPos;
+ };
+
+ constructor.prototype.lookChar = function ccittFaxStreamLookChar() {
+ if (this.buf != EOF)
+ return this.buf;
+
+ var refLine = this.refLine;
+ var codingLine = this.codingLine;
+ var columns = this.columns;
+
+ var refPos, blackPixels, bits;
+
+ if (this.outputBits == 0) {
+ if (this.eof)
+ return null;
+
+ this.err = false;
+
+ var code1, code2, code3;
+ if (this.nextLine2D) {
+ for (var i = 0; codingLine[i] < columns; ++i)
+ refLine[i] = codingLine[i];
+
+ refLine[i++] = columns;
+ refLine[i] = columns;
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ refPos = 0;
+ blackPixels = 0;
+
+ while (codingLine[this.codingPos] < columns) {
+ code1 = this.getTwoDimCode();
+ switch (code1) {
+ case twoDimPass:
+ this.addPixels(refLine[refPos + 1], blackPixels);
+ if (refLine[refPos + 1] < columns)
+ refPos += 2;
+ break;
+ case twoDimHoriz:
+ code1 = code2 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] +
+ code1, blackPixels);
+ if (codingLine[this.codingPos] < columns) {
+ this.addPixels(codingLine[this.codingPos] + code2,
+ blackPixels ^ 1);
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ break;
+ case twoDimVertR3:
+ this.addPixels(refLine[refPos] + 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertR2:
+ this.addPixels(refLine[refPos] + 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertR1:
+ this.addPixels(refLine[refPos] + 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVert0:
+ this.addPixels(refLine[refPos], blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL3:
+ this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL2:
+ this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case twoDimVertL1:
+ this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0)
+ --refPos;
+ else
+ ++refPos;
+
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns)
+ refPos += 2;
+ }
+ break;
+ case EOF:
+ this.addPixels(columns, 0);
+ this.eof = true;
+ break;
+ default:
+ warn('bad 2d code');
+ this.addPixels(columns, 0);
+ this.err = true;
+ }
+ }
+ } else {
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ blackPixels = 0;
+ while (codingLine[this.codingPos] < columns) {
+ code1 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
+ blackPixels ^= 1;
+ }
+ }
+
+ if (this.byteAlign)
+ this.inputBits &= ~7;
+
+ var gotEOL = false;
+
+ if (!this.eoblock && this.row == this.rows - 1) {
+ this.eof = true;
+ } else {
+ code1 = this.lookBits(12);
+ while (code1 == 0) {
+ this.eatBits(1);
+ code1 = this.lookBits(12);
+ }
+ if (code1 == 1) {
+ this.eatBits(12);
+ gotEOL = true;
+ } else if (code1 == EOF) {
+ this.eof = true;
+ }
+ }
+
+ if (!this.eof && this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ if (this.eoblock && gotEOL) {
+ code1 = this.lookBits(12);
+ if (code1 == 1) {
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ if (this.encoding >= 0) {
+ for (var i = 0; i < 4; ++i) {
+ code1 = this.lookBits(12);
+ if (code1 != 1)
+ warn('bad rtc code: ' + code1);
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ }
+ }
+ this.eof = true;
+ }
+ } else if (this.err && this.eoline) {
+ while (true) {
+ code1 = this.lookBits(13);
+ if (code1 == EOF) {
+ this.eof = true;
+ return null;
+ }
+ if ((code1 >> 1) == 1) {
+ break;
+ }
+ this.eatBits(1);
+ }
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.eatBits(1);
+ this.nextLine2D = !(code1 & 1);
+ }
+ }
+
+ if (codingLine[0] > 0)
+ this.outputBits = codingLine[this.codingPos = 0];
+ else
+ this.outputBits = codingLine[this.codingPos = 1];
+ this.row++;
+ }
+
+ if (this.outputBits >= 8) {
+ this.buf = (this.codingPos & 1) ? 0 : 0xFF;
+ this.outputBits -= 8;
+ if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ }
+ } else {
+ var bits = 8;
+ this.buf = 0;
+ do {
+ if (this.outputBits > bits) {
+ this.buf <<= bits;
+ if (!(this.codingPos & 1)) {
+ this.buf |= 0xFF >> (8 - bits);
+ }
+ this.outputBits -= bits;
+ bits = 0;
+ } else {
+ this.buf <<= this.outputBits;
+ if (!(this.codingPos & 1)) {
+ this.buf |= 0xFF >> (8 - this.outputBits);
+ }
+ bits -= this.outputBits;
+ this.outputBits = 0;
+ if (codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ } else if (bits > 0) {
+ this.buf <<= bits;
+ bits = 0;
+ }
+ }
+ } while (bits);
+ }
+ if (this.black) {
+ this.buf ^= 0xFF;
+ }
+ return this.buf;
+ };
+
+ // This functions returns the code found from the table.
+ // The start and end parameters set the boundaries for searching the table.
+ // The limit parameter is optional. Function returns an array with three
+ // values. The first array element indicates whether a valid code is being
+ // returned. The second array element is the actual code. The third array
+ // element indicates whether EOF was reached.
+ var findTableCode = function ccittFaxStreamFindTableCode(start, end, table,
+ limit) {
+ var limitValue = limit || 0;
+
+ for (var i = start; i <= end; ++i) {
+ var code = this.lookBits(i);
+ if (code == EOF)
+ return [true, 1, false];
+ if (i < end)
+ code <<= end - i;
+ if (!limitValue || code >= limitValue) {
+ var p = table[code - limitValue];
+ if (p[0] == i) {
+ this.eatBits(i);
+ return [true, p[1], true];
+ }
+ }
+ }
+ return [false, 0, false];
+ };
+
+ constructor.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() {
+ var code = 0;
+ var p;
+ if (this.eoblock) {
+ code = this.lookBits(7);
+ p = twoDimTable[code];
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(1, 7, twoDimTable);
+ if (result[0] && result[2])
+ return result[1];
+ }
+ warn('Bad two dim code');
+ return EOF;
+ };
+
+ constructor.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() {
+ var code = 0;
+ var p;
+ var n;
+ if (this.eoblock) {
+ code = this.lookBits(12);
+ if (code == EOF)
+ return 1;
+
+ if ((code >> 5) == 0)
+ p = whiteTable1[code];
+ else
+ p = whiteTable2[code >> 3];
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(1, 9, whiteTable2);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(11, 12, whiteTable1);
+ if (result[0])
+ return result[1];
+ }
+ warn('bad white code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ constructor.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() {
+ var code, p;
+ if (this.eoblock) {
+ code = this.lookBits(13);
+ if (code == EOF)
+ return 1;
+ if ((code >> 7) == 0)
+ p = blackTable1[code];
+ else if ((code >> 9) == 0 && (code >> 7) != 0)
+ p = blackTable2[(code >> 1) - 64];
+ else
+ p = blackTable3[code >> 7];
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = findTableCode(2, 6, blackTable3);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(7, 12, blackTable2, 64);
+ if (result[0])
+ return result[1];
+
+ result = findTableCode(10, 13, blackTable1);
+ if (result[0])
+ return result[1];
+ }
+ warn('bad black code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ constructor.prototype.lookBits = function ccittFaxStreamLookBits(n) {
+ var c;
+ while (this.inputBits < n) {
+ if ((c = this.str.getByte()) == null) {
+ if (this.inputBits == 0)
+ return EOF;
+ return ((this.inputBuf << (n - this.inputBits)) &
+ (0xFFFF >> (16 - n)));
+ }
+ this.inputBuf = (this.inputBuf << 8) + c;
+ this.inputBits += 8;
+ }
+ return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
+ };
+
+ constructor.prototype.eatBits = function ccittFaxStreamEatBits(n) {
+ if ((this.inputBits -= n) < 0)
+ this.inputBits = 0;
+ };
+
+ return constructor;
+})();
+
+var LZWStream = (function lzwStream() {
+ function constructor(str, earlyChange) {
+ this.str = str;
+ this.dict = str.dict;
+ this.cachedData = 0;
+ this.bitsCached = 0;
+
+ var maxLzwDictionarySize = 4096;
+ var lzwState = {
+ earlyChange: earlyChange,
+ codeLength: 9,
+ nextCode: 258,
+ dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+ dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+ dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+ currentSequence: new Uint8Array(maxLzwDictionarySize),
+ currentSequenceLength: 0
+ };
+ for (var i = 0; i < 256; ++i) {
+ lzwState.dictionaryValues[i] = i;
+ lzwState.dictionaryLengths[i] = 1;
+ }
+ this.lzwState = lzwState;
+
+ DecodeStream.call(this);
+ }
+
+ constructor.prototype = Object.create(DecodeStream.prototype);
+
+ constructor.prototype.readBits = function lzwStreamReadBits(n) {
+ var bitsCached = this.bitsCached;
+ var cachedData = this.cachedData;
+ while (bitsCached < n) {
+ var c = this.str.getByte();
+ if (c == null) {
+ this.eof = true;
+ return null;
+ }
+ cachedData = (cachedData << 8) | c;
+ bitsCached += 8;
+ }
+ this.bitsCached = (bitsCached -= n);
+ this.cachedData = cachedData;
+ this.lastCode = null;
+ return (cachedData >>> bitsCached) & ((1 << n) - 1);
+ };
+
+ constructor.prototype.readBlock = function lzwStreamReadBlock() {
+ var blockSize = 512;
+ var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
+ var i, j, q;
+
+ var lzwState = this.lzwState;
+ if (!lzwState)
+ return; // eof was found
+
+ var earlyChange = lzwState.earlyChange;
+ var nextCode = lzwState.nextCode;
+ var dictionaryValues = lzwState.dictionaryValues;
+ var dictionaryLengths = lzwState.dictionaryLengths;
+ var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+ var codeLength = lzwState.codeLength;
+ var prevCode = lzwState.prevCode;
+ var currentSequence = lzwState.currentSequence;
+ var currentSequenceLength = lzwState.currentSequenceLength;
+
+ var decodedLength = 0;
+ var currentBufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+
+ for (i = 0; i < blockSize; i++) {
+ var code = this.readBits(codeLength);
+ var hasPrev = currentSequenceLength > 0;
+ if (code < 256) {
+ currentSequence[0] = code;
+ currentSequenceLength = 1;
+ } else if (code >= 258) {
+ if (code < nextCode) {
+ currentSequenceLength = dictionaryLengths[code];
+ for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+ currentSequence[j] = dictionaryValues[q];
+ q = dictionaryPrevCodes[q];
+ }
+ } else {
+ currentSequence[currentSequenceLength++] = currentSequence[0];
+ }
+ } else if (code == 256) {
+ codeLength = 9;
+ nextCode = 258;
+ currentSequenceLength = 0;
+ continue;
+ } else {
+ this.eof = true;
+ delete this.lzwState;
+ break;
+ }
+
+ if (hasPrev) {
+ dictionaryPrevCodes[nextCode] = prevCode;
+ dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+ dictionaryValues[nextCode] = currentSequence[0];
+ nextCode++;
+ codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
+ codeLength : Math.min(Math.log(nextCode + earlyChange) /
+ 0.6931471805599453 + 1, 12) | 0;
+ }
+ prevCode = code;
+
+ decodedLength += currentSequenceLength;
+ if (estimatedDecodedSize < decodedLength) {
+ do {
+ estimatedDecodedSize += decodedSizeDelta;
+ } while (estimatedDecodedSize < decodedLength);
+ buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+ }
+ for (j = 0; j < currentSequenceLength; j++)
+ buffer[currentBufferLength++] = currentSequence[j];
+ }
+ lzwState.nextCode = nextCode;
+ lzwState.codeLength = codeLength;
+ lzwState.prevCode = prevCode;
+ lzwState.currentSequenceLength = currentSequenceLength;
+
+ this.bufferLength = currentBufferLength;
+ };
+
+ return constructor;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/util.js b/apps/files_pdfviewer/js/pdfjs/src/util.js
new file mode 100755
index 00000000000..4fb96f062a8
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/util.js
@@ -0,0 +1,286 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function log(msg) {
+ if (console && console.log)
+ console.log(msg);
+ else if (print)
+ print(msg);
+}
+
+function warn(msg) {
+ if (verbosity >= WARNINGS)
+ log('Warning: ' + msg);
+}
+
+function backtrace() {
+ try {
+ throw new Error();
+ } catch (e) {
+ return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+ }
+}
+
+function error(msg) {
+ log('Error: ' + msg);
+ log(backtrace());
+ throw new Error(msg);
+}
+
+function TODO(what) {
+ if (verbosity >= TODOS)
+ log('TODO: ' + what);
+}
+
+function malformed(msg) {
+ error('Malformed PDF: ' + msg);
+}
+
+function assert(cond, msg) {
+ if (!cond)
+ error(msg);
+}
+
+// In a well-formed PDF, |cond| holds. If it doesn't, subsequent
+// behavior is undefined.
+function assertWellFormed(cond, msg) {
+ if (!cond)
+ malformed(msg);
+}
+
+function shadow(obj, prop, value) {
+ Object.defineProperty(obj, prop, { value: value,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return value;
+}
+
+function bytesToString(bytes) {
+ var str = '';
+ var length = bytes.length;
+ for (var n = 0; n < length; ++n)
+ str += String.fromCharCode(bytes[n]);
+ return str;
+}
+
+function stringToBytes(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var n = 0; n < length; ++n)
+ bytes[n] = str.charCodeAt(n) & 0xFF;
+ return bytes;
+}
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = (function utilUtil() {
+ function constructor() {}
+ constructor.makeCssRgb = function makergb(r, g, b) {
+ var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
+ return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+ };
+ constructor.makeCssCmyk = function makecmyk(c, m, y, k) {
+ c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
+ var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
+ return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+ };
+ constructor.applyTransform = function apply(p, m) {
+ var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+ var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+ return [xt, yt];
+ };
+
+ return constructor;
+})();
+
+var PDFStringTranslateTable = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+ 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+ 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+ 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+ var i, n = str.length, str2 = '';
+ if (str[0] === '\xFE' && str[1] === '\xFF') {
+ // UTF16BE BOM
+ for (i = 2; i < n; i += 2)
+ str2 += String.fromCharCode(
+ (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
+ } else {
+ for (i = 0; i < n; ++i) {
+ var code = PDFStringTranslateTable[str.charCodeAt(i)];
+ str2 += code ? String.fromCharCode(code) : str.charAt(i);
+ }
+ }
+ return str2;
+}
+
+function isBool(v) {
+ return typeof v == 'boolean';
+}
+
+function isInt(v) {
+ return typeof v == 'number' && ((v | 0) == v);
+}
+
+function isNum(v) {
+ return typeof v == 'number';
+}
+
+function isString(v) {
+ return typeof v == 'string';
+}
+
+function isNull(v) {
+ return v === null;
+}
+
+function isName(v) {
+ return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+ return v instanceof Cmd && (!cmd || v.cmd == cmd);
+}
+
+function isDict(v, type) {
+ return v instanceof Dict && (!type || v.get('Type').name == type);
+}
+
+function isArray(v) {
+ return v instanceof Array;
+}
+
+function isStream(v) {
+ return typeof v == 'object' && v != null && ('getChar' in v);
+}
+
+function isArrayBuffer(v) {
+ return typeof v == 'object' && v != null && ('byteLength' in v);
+}
+
+function isRef(v) {
+ return v instanceof Ref;
+}
+
+function isPDFFunction(v) {
+ var fnDict;
+ if (typeof v != 'object')
+ return false;
+ else if (isDict(v))
+ fnDict = v;
+ else if (isStream(v))
+ fnDict = v.dict;
+ else
+ return false;
+ return fnDict.has('FunctionType');
+}
+
+/**
+ * 'Promise' object.
+ * Each object that is stored in PDFObjects is based on a Promise object that
+ * contains the status of the object and the data. There migth be situations,
+ * where a function want to use the value of an object, but it isn't ready at
+ * that time. To get a notification, once the object is ready to be used, s.o.
+ * can add a callback using the `then` method on the promise that then calls
+ * the callback once the object gets resolved.
+ * A promise can get resolved only once and only once the data of the promise
+ * can be set. If any of these happens twice or the data is required before
+ * it was set, an exception is throw.
+ */
+var Promise = (function promise() {
+ var EMPTY_PROMISE = {};
+
+ /**
+ * If `data` is passed in this constructor, the promise is created resolved.
+ * If there isn't data, it isn't resolved at the beginning.
+ */
+ function Promise(name, data) {
+ this.name = name;
+ // If you build a promise and pass in some data it's already resolved.
+ if (data != null) {
+ this.isResolved = true;
+ this._data = data;
+ this.hasData = true;
+ } else {
+ this.isResolved = false;
+ this._data = EMPTY_PROMISE;
+ }
+ this.callbacks = [];
+ };
+
+ Promise.prototype = {
+ hasData: false,
+
+ set data(value) {
+ if (value === undefined) {
+ return;
+ }
+ if (this._data !== EMPTY_PROMISE) {
+ throw 'Promise ' + this.name +
+ ': Cannot set the data of a promise twice';
+ }
+ this._data = value;
+ this.hasData = true;
+
+ if (this.onDataCallback) {
+ this.onDataCallback(value);
+ }
+ },
+
+ get data() {
+ if (this._data === EMPTY_PROMISE) {
+ throw 'Promise ' + this.name + ': Cannot get data that isn\'t set';
+ }
+ return this._data;
+ },
+
+ onData: function promiseOnData(callback) {
+ if (this._data !== EMPTY_PROMISE) {
+ callback(this._data);
+ } else {
+ this.onDataCallback = callback;
+ }
+ },
+
+ resolve: function promiseResolve(data) {
+ if (this.isResolved) {
+ throw 'A Promise can be resolved only once ' + this.name;
+ }
+
+ this.isResolved = true;
+ this.data = data;
+ var callbacks = this.callbacks;
+
+ for (var i = 0, ii = callbacks.length; i < ii; i++) {
+ callbacks[i].call(null, data);
+ }
+ },
+
+ then: function promiseThen(callback) {
+ if (!callback) {
+ throw 'Requiring callback' + this.name;
+ }
+
+ // If the promise is already resolved, call the callback directly.
+ if (this.isResolved) {
+ var data = this.data;
+ callback.call(null, data);
+ } else {
+ this.callbacks.push(callback);
+ }
+ }
+ };
+
+ return Promise;
+})();
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js b/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js
new file mode 100755
index 00000000000..97d7e5a251f
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js
@@ -0,0 +1,298 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+var CFFEncodingMap = {
+ '0': '-reserved-',
+ '1': 'hstem',
+ '2': '-reserved-',
+ '3': 'vstem',
+ '4': 'vmoveto',
+ '5': 'rlineto',
+ '6': 'hlineto',
+ '7': 'vlineto',
+ '8': 'rrcurveto',
+ '9': '-reserved-',
+ '10': 'callsubr',
+ '11': 'return',
+ '12': {
+ '3': 'and',
+ '4': 'or',
+ '5': 'not',
+ '9': 'abs',
+ '10': 'add',
+ '11': 'div',
+ '12': 'sub',
+ '14': 'neg',
+ '15': 'eq',
+ '18': 'drop',
+ '20': 'put',
+ '21': 'get',
+ '22': 'ifelse',
+ '23': 'random',
+ '24': 'mul',
+ '26': 'sqrt',
+ '27': 'dup',
+ '28': 'exch',
+ '29': 'index',
+ '30': 'roll',
+ '34': 'hflex',
+ '35': 'flex',
+ '36': 'hflex1',
+ '37': 'flex1'
+ },
+ '13': '-reserved-',
+ '14': 'endchar',
+ '15': '-reserved-',
+ '16': '-reserved-',
+ '17': '-reserved-',
+ '18': 'hstemhm',
+ '19': 'hintmask',
+ '20': 'cntrmask',
+ '21': 'rmoveto',
+ '22': 'hmoveto',
+ '23': 'vstemhm',
+ '24': 'rcurveline',
+ '25': 'rlivecurve',
+ '26': 'vvcurveto',
+ '27': 'hhcurveto',
+ '29': 'callgsubr',
+ '30': 'vhcurveto',
+ '31': 'hvcurveto'
+};
+
+var CFFDictDataMap = {
+ '0': {
+ name: 'version',
+ operand: 'SID'
+ },
+ '1': {
+ name: 'Notice',
+ operand: 'SID'
+ },
+ '2': {
+ name: 'FullName',
+ operand: 'SID'
+ },
+ '3': {
+ name: 'FamilyName',
+ operand: 'SID'
+ },
+ '4': {
+ name: 'Weight',
+ operand: 'SID'
+ },
+ '5': {
+ name: 'FontBBox',
+ operand: [0, 0, 0, 0]
+ },
+ '6': {
+ name: 'BlueValues'
+ },
+ '7': {
+ name: 'OtherBlues'
+ },
+ '8': {
+ name: 'FamilyBlues'
+ },
+ '9': {
+ name: 'FamilyOtherBlues'
+ },
+ '10': {
+ name: 'StdHW'
+ },
+ '11': {
+ name: 'StdVW'
+ },
+ '12': {
+ '0': {
+ name: 'Copyright',
+ operand: 'SID'
+ },
+ '1': {
+ name: 'IsFixedPitch',
+ operand: false
+ },
+ '2': {
+ name: 'ItalicAngle',
+ operand: 0
+ },
+ '3': {
+ name: 'UnderlinePosition',
+ operand: -100
+ },
+ '4': {
+ name: 'UnderlineThickness',
+ operand: 50
+ },
+ '5': {
+ name: 'PaintType',
+ operand: 0
+ },
+ '6': {
+ name: 'CharstringType',
+ operand: 2
+ },
+ '7': {
+ name: 'FontMatrix',
+ operand: [0.001, 0, 0, 0.001, 0 , 0]
+ },
+ '8': {
+ name: 'StrokeWidth',
+ operand: 0
+ },
+ '9': {
+ name: 'BlueScale'
+ },
+ '10': {
+ name: 'BlueShift'
+ },
+ '11': {
+ name: 'BlueFuzz'
+ },
+ '12': {
+ name: 'StemSnapH'
+ },
+ '13': {
+ name: 'StemSnapV'
+ },
+ '14': {
+ name: 'ForceBold'
+ },
+ '17': {
+ name: 'LanguageGroup'
+ },
+ '18': {
+ name: 'ExpansionFactor'
+ },
+ '19': {
+ name: 'initialRandomSeed'
+ },
+ '20': {
+ name: 'SyntheticBase',
+ operand: null
+ },
+ '21': {
+ name: 'PostScript',
+ operand: 'SID'
+ },
+ '22': {
+ name: 'BaseFontName',
+ operand: 'SID'
+ },
+ '23': {
+ name: 'BaseFontBlend',
+ operand: 'delta'
+ }
+ },
+ '13': {
+ name: 'UniqueID',
+ operand: null
+ },
+ '14': {
+ name: 'XUID',
+ operand: []
+ },
+ '15': {
+ name: 'charset',
+ operand: 0
+ },
+ '16': {
+ name: 'Encoding',
+ operand: 0
+ },
+ '17': {
+ name: 'CharStrings',
+ operand: null
+ },
+ '18': {
+ name: 'Private',
+ operand: 'number number'
+ },
+ '19': {
+ name: 'Subrs'
+ },
+ '20': {
+ name: 'defaultWidthX'
+ },
+ '21': {
+ name: 'nominalWidthX'
+ }
+};
+
+var CFFDictPrivateDataMap = {
+ '6': {
+ name: 'BluesValues',
+ operand: 'delta'
+ },
+ '7': {
+ name: 'OtherBlues',
+ operand: 'delta'
+ },
+ '8': {
+ name: 'FamilyBlues',
+ operand: 'delta'
+ },
+ '9': {
+ name: 'FamilyOtherBlues',
+ operand: 'delta'
+ },
+ '10': {
+ name: 'StdHW',
+ operand: null
+ },
+ '11': {
+ name: 'StdVW',
+ operand: null
+ },
+ '12': {
+ '9': {
+ name: 'BlueScale',
+ operand: 0.039625
+ },
+ '10': {
+ name: 'BlueShift',
+ operand: 7
+ },
+ '11': {
+ name: 'BlueFuzz',
+ operand: 1
+ },
+ '12': {
+ name: 'StemSnapH',
+ operand: 'delta'
+ },
+ '13': {
+ name: 'StemSnapV',
+ operand: 'delta'
+ },
+ '14': {
+ name: 'ForceBold',
+ operand: 'boolean'
+ },
+ '17': {
+ name: 'LanguageGroup',
+ operand: 0
+ },
+ '18': {
+ name: 'ExpansionFactor',
+ operand: 0.06
+ },
+ '19': {
+ name: 'initialRandomSeed',
+ operand: 0
+ }
+ },
+ '19': {
+ name: 'Subrs',
+ operand: null
+ },
+ '20': {
+ name: 'defaultWidthX',
+ operand: 0
+ },
+ '21': {
+ name: 'nominalWidthX',
+ operand: 0
+ }
+};
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js b/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js
new file mode 100755
index 00000000000..2a1f0ea72ae
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js
@@ -0,0 +1,408 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+/*
+ * The Type2 reader code below is only used for debugging purpose since Type2
+ * is only a CharString format and is never used directly as a Font file.
+ *
+ * So the code here is useful for dumping the data content of a .cff file in
+ * order to investigate the similarity between a Type1 CharString and a Type2
+ * CharString or to understand the structure of the CFF format.
+ */
+
+/*
+ * Build a charset by assigning the glyph name and the human readable form
+ * of the glyph data.
+ */
+function readCharset(aStream, aCharstrings) {
+ var charset = {};
+
+ var format = aStream.getByte();
+ var count = aCharstrings.length - 1;
+ if (format == 0) {
+ charset['.notdef'] = readCharstringEncoding(aCharstrings[0]);
+
+ for (var i = 1; i < count + 1; i++) {
+ var sid = aStream.getByte() << 8 | aStream.getByte();
+ charset[CFFStrings[sid]] = readCharstringEncoding(aCharstrings[i]);
+ //log(CFFStrings[sid] + "::" + charset[CFFStrings[sid]]);
+ }
+ } else if (format == 1) {
+ for (var i = 1; i < count + 1; i++) {
+ var first = aStream.getByte();
+ first = (first << 8) | aStream.getByte();
+ var numLeft = aStream.getByte();
+ for (var j = 0; j <= numLeft; j++) {
+ var sid = first++;
+ if (CFFStrings[sid] == 'three')
+ log(aCharstrings[j]);
+ charset[CFFStrings[sid]] = readCharstringEncoding(aCharstrings[j]);
+ }
+ }
+ } else {
+ error('Invalid charset format');
+ }
+
+ return charset;
+}
+
+/*
+ * Take a Type2 binary charstring as input and transform it to a human
+ * readable representation as specified by the 'The Type 2 Charstring Format',
+ * chapter 3.1.
+ */
+function readCharstringEncoding(aString) {
+ if (!aString)
+ return '';
+
+ var charstringTokens = [];
+
+ var count = aString.length;
+ for (var i = 0; i < count; ) {
+ var value = aString[i++];
+ var token = null;
+
+ if (value < 0) {
+ continue;
+ } else if (value <= 11) {
+ token = CFFEncodingMap[value];
+ } else if (value == 12) {
+ token = CFFEncodingMap[value][aString[i++]];
+ } else if (value <= 18) {
+ token = CFFEncodingMap[value];
+ } else if (value <= 20) {
+ var mask = aString[i++];
+ token = CFFEncodingMap[value];
+ } else if (value <= 27) {
+ token = CFFEncodingMap[value];
+ } else if (value == 28) {
+ token = aString[i++] << 8 | aString[i++];
+ } else if (value <= 31) {
+ token = CFFEncodingMap[value];
+ } else if (value < 247) {
+ token = parseInt(value, 10) - 139;
+ } else if (value < 251) {
+ token = (value - 247) * 256 + aString[i++] + 108;
+ } else if (value < 255) {
+ token = -(value - 251) * 256 - aString[i++] - 108;
+ } else {// value == 255
+ token = aString[i++] << 24 | aString[i++] << 16 |
+ aString[i++] << 8 | aString[i];
+ }
+
+ charstringTokens.push(token);
+ }
+
+ return charstringTokens;
+}
+
+
+/*
+ * Take a binary DICT Data as input and transform it into a human readable
+ * form as specified by 'The Compact Font Format Specification', chapter 5.
+ */
+function readFontDictData(aString, aMap) {
+ var fontDictDataTokens = [];
+
+ var count = aString.length;
+ for (var i = 0; i < count; i) {
+ var value = aString[i++];
+ var token = null;
+
+ if (value == 12) {
+ token = aMap[value][aString[i++]];
+ } else if (value == 28) {
+ token = aString[i++] << 8 | aString[i++];
+ } else if (value == 29) {
+ token = aString[i++] << 24 |
+ aString[i++] << 16 |
+ aString[i++] << 8 |
+ aString[i++];
+ } else if (value == 30) {
+ token = '';
+ var parsed = false;
+ while (!parsed) {
+ var byte = aString[i++];
+
+ var nibbles = [parseInt(byte / 16, 10), parseInt(byte % 16, 10)];
+ for (var j = 0; j < nibbles.length; j++) {
+ var nibble = nibbles[j];
+ switch (nibble) {
+ case 0xA:
+ token += '.';
+ break;
+ case 0xB:
+ token += 'E';
+ break;
+ case 0xC:
+ token += 'E-';
+ break;
+ case 0xD:
+ break;
+ case 0xE:
+ token += '-';
+ break;
+ case 0xF:
+ parsed = true;
+ break;
+ default:
+ token += nibble;
+ break;
+ }
+ }
+ }
+ token = parseFloat(token);
+ } else if (value <= 31) {
+ token = aMap[value];
+ } else if (value <= 246) {
+ token = parseInt(value, 10) - 139;
+ } else if (value <= 250) {
+ token = (value - 247) * 256 + aString[i++] + 108;
+ } else if (value <= 254) {
+ token = -(value - 251) * 256 - aString[i++] - 108;
+ } else if (value == 255) {
+ error('255 is not a valid DICT command');
+ }
+
+ fontDictDataTokens.push(token);
+ }
+
+ return fontDictDataTokens;
+}
+
+/*
+ * Take a stream as input and return an array of objects.
+ * In CFF an INDEX is a structure with the following format:
+ * {
+ * count: 2 bytes (Number of objects stored in INDEX),
+ * offsize: 1 byte (Offset array element size),
+ * offset: [count + 1] bytes (Offsets array),
+ * data: - (Objects data)
+ * }
+ *
+ * More explanation are given in the 'CFF Font Format Specification',
+ * chapter 5.
+ */
+function readFontIndexData(aStream, aIsByte) {
+ var count = aStream.getByte() << 8 | aStream.getByte();
+ var offsize = aStream.getByte();
+
+ function getNextOffset() {
+ switch (offsize) {
+ case 0:
+ return 0;
+ case 1:
+ return aStream.getByte();
+ case 2:
+ return aStream.getByte() << 8 | aStream.getByte();
+ case 3:
+ return aStream.getByte() << 16 | aStream.getByte() << 8 |
+ aStream.getByte();
+ case 4:
+ return aStream.getByte() << 24 | aStream.getByte() << 16 |
+ aStream.getByte() << 8 | aStream.getByte();
+ }
+ error(offsize + ' is not a valid offset size');
+ return null;
+ }
+
+ var offsets = [];
+ for (var i = 0; i < count + 1; i++)
+ offsets.push(getNextOffset());
+
+ dump('Found ' + count + ' objects at offsets :' +
+ offsets + ' (offsize: ' + offsize + ')');
+
+ // Now extract the objects
+ var relativeOffset = aStream.pos;
+ var objects = [];
+ for (var i = 0; i < count; i++) {
+ var offset = offsets[i];
+ aStream.pos = relativeOffset + offset - 1;
+
+ var data = [];
+ var length = offsets[i + 1] - 1;
+ for (var j = offset - 1; j < length; j++)
+ data.push(aIsByte ? aStream.getByte() : aStream.getChar());
+ objects.push(data);
+ }
+
+ return objects;
+}
+
+var Type2Parser = function type2Parser(aFilePath) {
+ var font = new Dict();
+
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', aFilePath, false);
+ xhr.mozResponseType = xhr.responseType = 'arraybuffer';
+ xhr.expected = (document.URL.indexOf('file:') == 0) ? 0 : 200;
+ xhr.send(null);
+ this.data = new Stream(xhr.mozResponseArrayBuffer || xhr.mozResponse ||
+ xhr.responseArrayBuffer || xhr.response);
+
+ // Turn on this flag for additional debugging logs
+ var debug = false;
+
+ function dump(aStr) {
+ if (debug)
+ log(aStr);
+ }
+
+ function parseAsToken(aString, aMap) {
+ var decoded = readFontDictData(aString, aMap);
+
+ var stack = [];
+ var count = decoded.length;
+ for (var i = 0; i < count; i++) {
+ var token = decoded[i];
+ if (isNum(token)) {
+ stack.push(token);
+ } else {
+ switch (token.operand) {
+ case 'SID':
+ font.set(token.name, CFFStrings[stack.pop()]);
+ break;
+ case 'number number':
+ font.set(token.name, {
+ offset: stack.pop(),
+ size: stack.pop()
+ });
+ break;
+ case 'boolean':
+ font.set(token.name, stack.pop());
+ break;
+ case 'delta':
+ font.set(token.name, stack.pop());
+ break;
+ default:
+ if (token.operand && token.operand.length) {
+ var array = [];
+ for (var j = 0; j < token.operand.length; j++)
+ array.push(stack.pop());
+ font.set(token.name, array);
+ } else {
+ font.set(token.name, stack.pop());
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ this.parse = function type2ParserParse(aStream) {
+ font.set('major', aStream.getByte());
+ font.set('minor', aStream.getByte());
+ font.set('hdrSize', aStream.getByte());
+ font.set('offsize', aStream.getByte());
+
+ // Read the NAME Index
+ dump('Reading Index: Names');
+ font.set('Names', readFontIndexData(aStream));
+ dump('Names: ' + font.get('Names'));
+
+ // Read the Top Dict Index
+ dump('Reading Index: TopDict');
+ var topDict = readFontIndexData(aStream, true);
+ dump('TopDict: ' + topDict);
+
+ // Read the String Index
+ dump('Reading Index: Strings');
+ var strings = readFontIndexData(aStream);
+ dump('strings: ' + strings);
+
+ // Fill up the Strings dictionary with the new unique strings
+ for (var i = 0; i < strings.length; i++)
+ CFFStrings.push(strings[i].join(''));
+
+ // Parse the TopDict operator
+ var objects = [];
+ var count = topDict.length;
+ for (var i = 0; i < count; i++)
+ parseAsToken(topDict[i], CFFDictDataMap);
+
+ // Read the Global Subr Index that comes just after the Strings Index
+ // (cf. "The Compact Font Format Specification" Chapter 16)
+ dump('Reading Global Subr Index');
+ var subrs = readFontIndexData(aStream, true);
+ dump(subrs);
+
+ // Reading Private Dict
+ var priv = font.get('Private');
+ dump('Reading Private Dict (offset: ' + priv.offset +
+ ' size: ' + priv.size + ')');
+ aStream.pos = priv.offset;
+
+ var privateDict = [];
+ for (var i = 0; i < priv.size; i++)
+ privateDict.push(aStream.getByte());
+ dump('private:' + privateDict);
+ parseAsToken(privateDict, CFFDictPrivateDataMap);
+
+ for (var p in font.map)
+ dump(p + '::' + font.get(p));
+
+ // Read CharStrings Index
+ var charStringsOffset = font.get('CharStrings');
+ dump('Read CharStrings Index (offset: ' + charStringsOffset + ')');
+ aStream.pos = charStringsOffset;
+ var charStrings = readFontIndexData(aStream, true);
+
+ // Read Charset
+ dump('Read Charset for ' + charStrings.length + ' glyphs');
+ var charsetEntry = font.get('charset');
+ if (charsetEntry == 0) {
+ error('Need to support CFFISOAdobeCharset');
+ } else if (charsetEntry == 1) {
+ error('Need to support CFFExpert');
+ } else if (charsetEntry == 2) {
+ error('Need to support CFFExpertSubsetCharset');
+ } else {
+ aStream.pos = charsetEntry;
+ var charset = readCharset(aStream, charStrings);
+ }
+ };
+};
+
+/*
+ * To try the Type2 decoder on a local file in the current directory:
+ *
+ * var cff = new Type2Parser("file.cff");
+ * cff.parse(this.data);
+ *
+ * To try the Type2 decoder on a custom built CFF array:
+ *
+ * var file = new Uint8Array(cffFileArray, 0, cffFileSize);
+ * var parser = new Type2Parser();
+ * parser.parse(new Stream(file));
+ *
+ */
+
+/*
+ * Write to a file to the disk (works only on Firefox in privilege mode)
+ * but this is useful for dumping a font file to the disk and check with
+ * fontforge or the ots program what's wrong with the file.
+ *
+ * writeToFile(fontData, "/tmp/pdf.js." + fontCount + ".cff");
+ */
+function writeToFile(aBytes, aFilePath) {
+ if (!('netscape' in window))
+ return;
+
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+ var Cc = Components.classes,
+ Ci = Components.interfaces;
+ var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
+ file.initWithPath(aFilePath);
+
+ var stream = Cc['@mozilla.org/network/file-output-stream;1']
+ .createInstance(Ci.nsIFileOutputStream);
+ stream.init(file, 0x04 | 0x08 | 0x20, 0x180, 0);
+
+ var bos = Cc['@mozilla.org/binaryoutputstream;1']
+ .createInstance(Ci.nsIBinaryOutputStream);
+ bos.setOutputStream(stream);
+ bos.writeByteArray(aBytes, aBytes.length);
+ stream.close();
+}
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/worker.js b/apps/files_pdfviewer/js/pdfjs/src/worker.js
new file mode 100755
index 00000000000..67f1bf658e1
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/worker.js
@@ -0,0 +1,193 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function MessageHandler(name, comObj) {
+ this.name = name;
+ this.comObj = comObj;
+ var ah = this.actionHandler = {};
+
+ ah['console_log'] = [function ahConsoleLog(data) {
+ console.log.apply(console, data);
+ }];
+ ah['console_error'] = [function ahConsoleError(data) {
+ console.error.apply(console, data);
+ }];
+
+ comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+ var data = event.data;
+ if (data.action in ah) {
+ var action = ah[data.action];
+ action[0].call(action[1], data.data);
+ } else {
+ throw 'Unkown action from worker: ' + data.action;
+ }
+ };
+}
+
+MessageHandler.prototype = {
+ on: function messageHandlerOn(actionName, handler, scope) {
+ var ah = this.actionHandler;
+ if (ah[actionName]) {
+ throw 'There is already an actionName called "' + actionName + '"';
+ }
+ ah[actionName] = [handler, scope];
+ },
+
+ send: function messageHandlerSend(actionName, data) {
+ this.comObj.postMessage({
+ action: actionName,
+ data: data
+ });
+ }
+};
+
+var WorkerMessageHandler = {
+ setup: function wphSetup(handler) {
+ var pdfDoc = null;
+
+ handler.on('test', function wphSetupTest(data) {
+ handler.send('test', data instanceof Uint8Array);
+ });
+
+ handler.on('workerSrc', function wphSetupWorkerSrc(data) {
+ // In development, the `workerSrc` message is handled in the
+ // `worker_loader.js` file. In production the workerProcessHandler is
+ // called for this. This servers as a dummy to prevent calling an
+ // undefined action `workerSrc`.
+ });
+
+ handler.on('doc', function wphSetupDoc(data) {
+ // Create only the model of the PDFDoc, which is enough for
+ // processing the content of the pdf.
+ pdfDoc = new PDFDocModel(new Stream(data));
+ });
+
+ handler.on('page_request', function wphSetupPageRequest(pageNum) {
+ pageNum = parseInt(pageNum);
+
+ var page = pdfDoc.getPage(pageNum);
+
+ // The following code does quite the same as
+ // Page.prototype.startRendering, but stops at one point and sends the
+ // result back to the main thread.
+ var gfx = new CanvasGraphics(null);
+
+ var start = Date.now();
+
+ var dependency = [];
+
+ // Pre compile the pdf page and fetch the fonts/images.
+ var IRQueue = page.getIRQueue(handler, dependency);
+
+ console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum,
+ Date.now() - start, IRQueue.fnArray.length);
+
+ // Filter the dependecies for fonts.
+ var fonts = {};
+ for (var i = 0, ii = dependency.length; i < ii; i++) {
+ var dep = dependency[i];
+ if (dep.indexOf('font_') == 0) {
+ fonts[dep] = true;
+ }
+ }
+
+ handler.send('page', {
+ pageNum: pageNum,
+ IRQueue: IRQueue,
+ depFonts: Object.keys(fonts)
+ });
+ }, this);
+
+ handler.on('font', function wphSetupFont(data) {
+ var objId = data[0];
+ var name = data[1];
+ var file = data[2];
+ var properties = data[3];
+
+ var font = {
+ name: name,
+ file: file,
+ properties: properties
+ };
+
+ // Some fonts don't have a file, e.g. the build in ones like Arial.
+ if (file) {
+ var fontFileDict = new Dict();
+ fontFileDict.map = file.dict.map;
+
+ var fontFile = new Stream(file.bytes, file.start,
+ file.end - file.start, fontFileDict);
+
+ // Check if this is a FlateStream. Otherwise just use the created
+ // Stream one. This makes complex_ttf_font.pdf work.
+ var cmf = file.bytes[0];
+ if ((cmf & 0x0f) == 0x08) {
+ font.file = new FlateStream(fontFile);
+ } else {
+ font.file = fontFile;
+ }
+ }
+
+ var obj = new Font(font.name, font.file, font.properties);
+
+ var str = '';
+ var objData = obj.data;
+ if (objData) {
+ var length = objData.length;
+ for (var j = 0; j < length; ++j)
+ str += String.fromCharCode(objData[j]);
+ }
+
+ obj.str = str;
+
+ // Remove the data array form the font object, as it's not needed
+ // anymore as we sent over the ready str.
+ delete obj.data;
+
+ handler.send('font_ready', [objId, obj]);
+ });
+ }
+};
+
+var consoleTimer = {};
+
+var workerConsole = {
+ log: function log() {
+ var args = Array.prototype.slice.call(arguments);
+ postMessage({
+ action: 'console_log',
+ data: args
+ });
+ },
+
+ error: function error() {
+ var args = Array.prototype.slice.call(arguments);
+ postMessage({
+ action: 'console_error',
+ data: args
+ });
+ },
+
+ time: function time(name) {
+ consoleTimer[name] = Date.now();
+ },
+
+ timeEnd: function timeEnd(name) {
+ var time = consoleTimer[name];
+ if (time == null) {
+ throw 'Unkown timer name ' + name;
+ }
+ this.log('Timer:', name, Date.now() - time);
+ }
+};
+
+// Worker thread?
+if (typeof window === 'undefined') {
+ globalScope.console = workerConsole;
+
+ var handler = new MessageHandler('worker_processor', this);
+ WorkerMessageHandler.setup(handler);
+}
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js b/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js
new file mode 100755
index 00000000000..7141fa3e39d
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js
@@ -0,0 +1,53 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function onMessageLoader(evt) {
+ // Reset the `onmessage` function as it was only set to call
+ // this function the first time a message is passed to the worker
+ // but shouldn't get called anytime afterwards.
+ this.onmessage = null;
+
+ if (evt.data.action !== 'workerSrc') {
+ throw 'Worker expects first message to be `workerSrc`';
+ }
+
+ // Content of `PDFJS.workerSrc` as defined on the main thread.
+ var workerSrc = evt.data.data;
+
+ // Extract the directory that contains the source files to load.
+ // Assuming the source files have the same relative possition as the
+ // `workerSrc` file.
+ var dir = workerSrc.substring(0, workerSrc.lastIndexOf('/') + 1);
+
+ // List of files to include;
+ var files = [
+ 'core.js',
+ 'util.js',
+ 'canvas.js',
+ 'obj.js',
+ 'function.js',
+ 'charsets.js',
+ 'cidmaps.js',
+ 'colorspace.js',
+ 'crypto.js',
+ 'evaluator.js',
+ 'fonts.js',
+ 'glyphlist.js',
+ 'image.js',
+ 'metrics.js',
+ 'parser.js',
+ 'pattern.js',
+ 'stream.js',
+ 'worker.js',
+ '../external/jpgjs/jpg.js'
+ ];
+
+ // Load all the files.
+ for (var i = 0; i < files.length; i++) {
+ importScripts(dir + files[i]);
+ }
+}
+
+this.onmessage = onMessageLoader;
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/bookmark.svg b/apps/files_pdfviewer/js/pdfjs/web/images/bookmark.svg
new file mode 100755
index 00000000000..2c1fa130d17
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/bookmark.svg
@@ -0,0 +1,661 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="240.00000"
+ inkscape:export-xdpi="240.00000"
+ inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png"
+ sodipodi:docname="bookmark.svg"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:version="0.32"
+ id="svg249"
+ height="48.000000px"
+ width="48.000000px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective100" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2906">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2908" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2910" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2896">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2898" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2900" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2598">
+ <stop
+ style="stop-color:#859dbc;stop-opacity:1;"
+ offset="0"
+ id="stop2600" />
+ <stop
+ style="stop-color:#547299;stop-opacity:1;"
+ offset="1"
+ id="stop2602" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2590">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2592" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2594" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5897">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.0000000;"
+ offset="0.0000000"
+ id="stop5899" />
+ <stop
+ id="stop5905"
+ offset="0.50000000"
+ style="stop-color:#000000;stop-opacity:0.56701028;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop5901" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5866">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5868" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop5870" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4404">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4406" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4408" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4542">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4544" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4546" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient269">
+ <stop
+ id="stop270"
+ offset="0.0000000"
+ style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop271"
+ offset="1.0000000"
+ style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12512">
+ <stop
+ id="stop12513"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop12517"
+ offset="0.50000000"
+ style="stop-color:#fff520;stop-opacity:0.89108908;" />
+ <stop
+ id="stop12514"
+ offset="1.0000000"
+ style="stop-color:#fff300;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <radialGradient
+ r="14.375000"
+ fy="125.00000"
+ fx="55.000000"
+ cy="125.00000"
+ cx="55.000000"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient278"
+ xlink:href="#linearGradient12512"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient269"
+ id="radialGradient15656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.968273,0.000000,0.000000,1.036374,3.250000,0.489522)"
+ cx="8.8244190"
+ cy="3.7561285"
+ fx="8.8244190"
+ fy="3.7561285"
+ r="37.751713" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient259"
+ id="radialGradient15658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.960493,0.000000,0.000000,1.044769,-0.103553,-0.159183)"
+ cx="33.966679"
+ cy="35.736916"
+ fx="33.966679"
+ fy="35.736916"
+ r="86.708450" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15662"
+ id="radialGradient15668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.973033,0.000000,0.000000,1.034937,3.168754,0.555277)"
+ cx="8.1435566"
+ cy="7.2678967"
+ fx="8.1435566"
+ fy="7.2678967"
+ r="38.158695" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4542"
+ id="radialGradient4548"
+ cx="24.306795"
+ cy="42.07798"
+ fx="24.306795"
+ fy="42.07798"
+ r="15.821514"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4404"
+ id="linearGradient4410"
+ x1="16.812500"
+ y1="1.8750000"
+ x2="16.812500"
+ y2="4.7187500"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.319549,0.000000,0.000000,1.362060,40.38853,-0.362057)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5866"
+ id="linearGradient5872"
+ x1="19.452349"
+ y1="13.174174"
+ x2="19.685436"
+ y2="27.095339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.224255,0.000000,0.000000,1.282176,0.371569,0.264657)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5897"
+ id="linearGradient5903"
+ x1="19.000000"
+ y1="9.7738247"
+ x2="19.000000"
+ y2="15.635596"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.319549,0.000000,0.000000,2.133926,-4.476133,-14.64845)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2590"
+ id="linearGradient2596"
+ x1="19.970377"
+ y1="6.1167107"
+ x2="19.970377"
+ y2="2.53125"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.319549,0.000000,0.000000,1.280356,-5.745298,0.249007)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2598"
+ id="linearGradient2604"
+ x1="18.431311"
+ y1="19.119474"
+ x2="18.402472"
+ y2="4.2702327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.319549,0.000000,0.000000,1.299013,-3.106200,-1.336165)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2896"
+ id="linearGradient2902"
+ x1="14.584077"
+ y1="1.6392649"
+ x2="14.552828"
+ y2="2.4912448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,1.594214,0.000000,-0.790249)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2906"
+ id="linearGradient2912"
+ x1="13.354311"
+ y1="1.4866425"
+ x2="14.075844"
+ y2="2.4017651"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,1.184816,0.000000,-0.727880)" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="158"
+ inkscape:window-x="433"
+ inkscape:window-height="690"
+ inkscape:window-width="872"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer5"
+ inkscape:cy="24"
+ inkscape:cx="24"
+ inkscape:zoom="9.8333333"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="0.25490196"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>New Bookmark</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>bookmark</rdf:li>
+ <rdf:li>remember</rdf:li>
+ <rdf:li>favorite</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>create bookmark action</dc:description>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Shadow">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.165152e-2,0,0,1.485743e-2,43.0076,42.68539)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ inkscape:label="Base"
+ id="layer1">
+ <rect
+ style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15391"
+ width="34.875000"
+ height="41.063431"
+ x="6.5000000"
+ y="3.5000000"
+ ry="1.1490481"
+ rx="1.1490486" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="32.937012"
+ height="39.028210"
+ x="7.5024552"
+ y="4.5010486"
+ ry="0.14904849"
+ rx="0.14904852" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.98855311;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.017543854"
+ d="M 11.505723,5.4942766 L 11.505723,43.400869"
+ id="path15672"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.20467831"
+ d="M 12.500000,5.0205154 L 12.500000,43.038228"
+ id="path15674"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Text"
+ style="display:inline">
+ <g
+ id="g2188">
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15686"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="9.0000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15688"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="11.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15690"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="13.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15692"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="15.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15694"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="17.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15696"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="19.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15698"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="21.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15700"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999994"
+ y="23.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15732"
+ width="9.0000057"
+ height="1.0000000"
+ x="15.999986"
+ y="25.000000"
+ rx="0.062003858"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15736"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999986"
+ y="29.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15738"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999986"
+ y="31.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15740"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999986"
+ y="33.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15742"
+ width="20.000006"
+ height="1.0000000"
+ x="15.999986"
+ y="35.000000"
+ rx="0.13778631"
+ ry="0.065390877" />
+ <rect
+ style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;visibility:visible;display:block;overflow:visible"
+ id="rect15744"
+ width="14.000014"
+ height="1.0000000"
+ x="15.999986"
+ y="37.000000"
+ rx="0.096450485"
+ ry="0.065390877" />
+ </g>
+ <path
+ style="opacity:0.28021976;fill:url(#linearGradient5872);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 28.245858,31.324906 L 21.147869,27.133701 L 14.30757,30.8838 L 13.761859,3.9475667 L 28.549598,3.9475667 L 28.245858,31.324906 z "
+ id="path5138"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ style="fill:url(#linearGradient2604);fill-opacity:1;fill-rule:evenodd;stroke:#364878;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline"
+ d="M 12.427339,3.5180202 C 12.427339,3.5180202 12.240033,0.60520607 15.107867,0.54270607 L 25.119343,0.50728624 C 26.277287,0.50728624 26.581888,1.1910178 26.581888,2.1095589 L 26.581888,29.729916 L 20.545426,24.533862 L 14.674346,29.729916 L 14.591655,3.519629 L 12.427339,3.5180202 z "
+ id="path2204"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="opacity:0.4450549;fill:url(#linearGradient4410);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 13.030252,3.0117919 C 13.011046,2.225362 13.312918,1.0801307 15.375418,1.0176307 L 25.027906,1 C 25.640922,1 26.090152,1.1674319 26.090152,1.7994802 L 26.060994,10.491851 L 15.317102,10.491851 L 15.192102,2.9993251 C 15.192102,2.9993251 13.030252,3.0117919 13.030252,3.0117919 z "
+ id="path3668"
+ sodipodi:nodetypes="cccccccs" />
+ <rect
+ style="opacity:0.28021976;fill:url(#linearGradient5903);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5895"
+ width="10.556392"
+ height="12.803556"
+ x="15.317101"
+ y="6.6907959"
+ rx="0.062003858"
+ ry="0.065390877" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2596);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.19125683;display:inline"
+ d="M 24.476832,2.2095507 L 25.575535,3.113139 L 25.547445,27.511911 L 20.497463,23.203758 L 15.704084,27.415203 L 15.699081,2.7495618 L 24.476832,2.2095507 z "
+ id="path5969"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="opacity:0.48295456;color:#000000;fill:url(#linearGradient2912);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10533953;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 15.158602,3.9384083 L 15.114407,1.0335178 C 12.983906,1.0335178 12.993087,2.9680775 12.993087,3.9384083 L 15.158602,3.9384083 z "
+ id="path2894"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path2904"
+ d="M 15.158602,3.9384086 L 15.114407,1.8247593 C 12.81631,1.8426926 12.993087,3.9384086 12.993087,3.9384086 L 15.158602,3.9384086 z "
+ style="opacity:0.35795455;color:#000000;fill:url(#linearGradient2902);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10533953;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/document-print.svg b/apps/files_pdfviewer/js/pdfjs/web/images/document-print.svg
new file mode 100755
index 00000000000..0b8837ba1df
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/document-print.svg
@@ -0,0 +1,532 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="document-print.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg2994"
+ height="48px"
+ width="48px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective84" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7612">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop7614" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop7616" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7612"
+ id="radialGradient7618"
+ cx="24.000000"
+ cy="41.875000"
+ fx="24.000000"
+ fy="41.875000"
+ r="19.125000"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,0.000000,27.91667)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient4762">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.12371134;"
+ offset="0.0000000"
+ id="stop4764" />
+ <stop
+ id="stop4768"
+ offset="0.10344828"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4766" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4741">
+ <stop
+ id="stop4743"
+ offset="0.0000000"
+ style="stop-color:#dcdcda;stop-opacity:1.0000000;" />
+ <stop
+ id="stop4745"
+ offset="1.0000000"
+ style="stop-color:#bab9b7;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4733">
+ <stop
+ id="stop4735"
+ offset="0.0000000"
+ style="stop-color:#000000;stop-opacity:0.23711340;" />
+ <stop
+ id="stop4737"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4698">
+ <stop
+ id="stop4700"
+ offset="0.0000000"
+ style="stop-color:#fffffd;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#bbbbb9;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop4706" />
+ <stop
+ id="stop4702"
+ offset="1.0000000"
+ style="stop-color:#000000;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4688">
+ <stop
+ id="stop4690"
+ offset="0.0000000"
+ style="stop-color:#666666;stop-opacity:1.0000000;" />
+ <stop
+ id="stop4692"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4680"
+ inkscape:collect="always">
+ <stop
+ id="stop4682"
+ offset="0"
+ style="stop-color:#f7f6f5;stop-opacity:1;" />
+ <stop
+ id="stop4684"
+ offset="1"
+ style="stop-color:#f7f6f5;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4668">
+ <stop
+ id="stop4670"
+ offset="0"
+ style="stop-color:#8e8d87;stop-opacity:1;" />
+ <stop
+ style="stop-color:#cbc9c1;stop-opacity:1.0000000;"
+ offset="0.27586207"
+ id="stop4676" />
+ <stop
+ id="stop4672"
+ offset="1.0000000"
+ style="stop-color:#8e8d87;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#e0e0e0;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.40546969"
+ id="stop4886" />
+ <stop
+ style="stop-color:#cdcdcd;stop-opacity:1.0000000;"
+ offset="0.53448278"
+ id="stop4884" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#494949;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ r="2.1227016"
+ fy="26.925594"
+ fx="9.1295490"
+ cy="26.925594"
+ cx="9.1295490"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1433"
+ xlink:href="#linearGradient4698"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="72.064316"
+ x2="9.9128132"
+ y1="57.227650"
+ x1="9.8698082"
+ gradientTransform="matrix(2.772086,0.000000,0.000000,0.360739,0.618718,2.883883)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1447"
+ xlink:href="#linearGradient4733"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="54.136139"
+ x2="10.338233"
+ y1="64.652260"
+ x1="10.338233"
+ gradientTransform="matrix(2.369844,0.000000,0.000000,0.421969,0.000000,2.000000)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1451"
+ xlink:href="#linearGradient4680"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="62.282467"
+ x2="9.7052784"
+ y1="70.724976"
+ x1="9.7316532"
+ gradientTransform="matrix(2.369844,0.000000,0.000000,0.421969,0.000000,2.000000)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1453"
+ xlink:href="#linearGradient4688"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="19.337463"
+ x2="20.717800"
+ y1="25.140253"
+ x1="20.771229"
+ gradientTransform="matrix(1.198769,0,0,0.853565,-0.143086,2.034513)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1456"
+ xlink:href="#linearGradient15662"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="25.247311"
+ x2="24.789707"
+ y1="3.6785457"
+ x1="25.056711"
+ gradientTransform="matrix(0.944939,0,0,1.076147,6.844577e-2,4.093177)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1459"
+ xlink:href="#linearGradient259"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="58.831264"
+ x2="15.487823"
+ y1="32.539238"
+ x1="15.387969"
+ gradientTransform="matrix(1.490161,0,0,0.668741,8.895132e-2,2)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1464"
+ xlink:href="#linearGradient4762"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="88.294930"
+ x2="18.972126"
+ y1="88.294930"
+ x1="1.8456430"
+ gradientTransform="matrix(2.291824,0,0,0.434269,8.855179e-2,2)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1468"
+ xlink:href="#linearGradient4741"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="88.294933"
+ x2="18.972126"
+ y1="88.294933"
+ x1="1.8456431"
+ gradientTransform="matrix(2.30272,0,0,0.437918,0,0.584034)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1471"
+ xlink:href="#linearGradient4668"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="160"
+ inkscape:window-x="331"
+ inkscape:window-height="688"
+ inkscape:window-width="872"
+ inkscape:guide-bbox="true"
+ showguides="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="-18.264187"
+ inkscape:cx="-72.591911"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="0.090196078"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:showpageshadow="false"
+ fill="#729fcf" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Print Document</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>document</rdf:li>
+ <rdf:li>lpr</rdf:li>
+ <rdf:li>print</rdf:li>
+ <rdf:li>local</rdf:li>
+ <rdf:li>laser</rdf:li>
+ <rdf:li>bubblejet</rdf:li>
+ <rdf:li>inkjet</rdf:li>
+ <rdf:li>print</rdf:li>
+ <rdf:li>output</rdf:li>
+ <rdf:li>cups</rdf:li>
+ <rdf:li>lpd</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.411405e-2,0,0,1.929202e-2,45.48953,39.75228)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <rect
+ ry="1.7115477"
+ rx="1.7115483"
+ y="36.004189"
+ x="4.75"
+ height="6.4915943"
+ width="38.4375"
+ id="rect4652"
+ style="fill:url(#linearGradient1471);fill-opacity:1;stroke:#595959;stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cssssssssssss"
+ id="rect4609"
+ d="M 7.1308961,21.5 L 40.870615,21.5 C 41.255661,21.5 41.747648,21.788155 42.051049,22.223919 C 42.354451,22.659684 43.787518,24.83394 44.109448,25.297964 C 44.431378,25.761987 44.502397,26.201852 44.502397,26.774049 L 44.502397,38.850951 C 44.502397,39.764524 43.770402,40.5 42.861152,40.5 L 5.1403596,40.5 C 4.2311094,40.5 3.4991138,39.764524 3.4991138,38.850951 L 3.4991138,26.774049 C 3.4991138,26.280031 3.6002798,25.571641 3.9455202,25.120718 C 4.3811666,24.551713 5.5498664,22.57277 5.8581276,22.153118 C 6.1663887,21.733467 6.7324461,21.5 7.1308961,21.5 z "
+ style="color:#000000;fill:url(#linearGradient1468);fill-opacity:1;fill-rule:nonzero;stroke:#676767;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cssssssss"
+ id="path4718"
+ d="M 7.705278,21.975532 C 7.20729,21.975532 6.5669691,22.107308 6.3043987,22.511224 L 4.4657443,25.339651 C 4.169761,25.794966 4.4993705,26.868141 5.3900051,26.868141 L 42.678553,26.868141 C 43.883282,26.868141 43.8868,25.858073 43.602814,25.428039 L 41.851714,22.776389 C 41.534204,22.295589 41.418956,21.975532 40.625945,21.975532 L 7.705278,21.975532 z "
+ style="fill:#fbfbfb;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1464);stroke-width:0.94696701;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 7.6002951,22.445756 L 40.374658,22.445756 C 40.739745,22.445756 41.206233,22.718629 41.493909,23.131283 C 41.781585,23.543938 42.788049,25.160945 43.093293,25.60036 C 43.398536,26.039775 43.528159,26.456312 43.528159,26.998164 L 43.528159,38.279261 C 43.528159,39.144385 43.394653,39.528356 42.532529,39.528356 L 5.530506,39.528356 C 4.6683828,39.528356 4.472593,39.144385 4.472593,38.279261 L 4.472593,26.998164 C 4.472593,26.530345 4.6930819,25.859523 5.0204282,25.432514 C 5.4334949,24.893685 6.1012112,23.461633 6.393495,23.064237 C 6.6857789,22.666841 7.222497,22.445756 7.6002951,22.445756 z "
+ id="path4750"
+ sodipodi:nodetypes="cssssssssssss" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="rect15391"
+ d="M 11.68177,4.4977642 L 36.313839,4.4977642 C 36.964072,4.4977642 37.487546,5.007949 37.487546,5.6416762 L 37.487546,24.348117 L 10.508063,24.348117 L 10.508063,5.6416762 C 10.508063,5.007949 11.031536,4.4977642 11.68177,4.4977642 z "
+ style="color:#000000;fill:url(#linearGradient1459);fill-opacity:1;fill-rule:nonzero;stroke:#898989;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1456);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="25.000576"
+ height="18.836374"
+ x="11.498513"
+ y="5.4992466"
+ ry="0.17677675"
+ rx="0.17677672" />
+ <rect
+ ry="1.7115483"
+ rx="1.7115483"
+ y="27.375000"
+ x="6.8750000"
+ height="5.1875000"
+ width="33.750000"
+ id="rect4678"
+ style="fill:url(#linearGradient1451);fill-opacity:1.0000000;stroke:url(#linearGradient1453);stroke-width:1.0000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="translate(0.000000,2.000000)"
+ d="M 10.871767 27.626486 A 1.2816310 1.2816310 0 1 1 8.3085046,27.626486 A 1.2816310 1.2816310 0 1 1 10.871767 27.626486 z"
+ sodipodi:ry="1.2816310"
+ sodipodi:rx="1.2816310"
+ sodipodi:cy="27.626486"
+ sodipodi:cx="9.5901356"
+ id="path4696"
+ style="fill:url(#radialGradient1433);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="csscssssc"
+ id="path4731"
+ d="M 11.743718,25.416053 L 37.306218,25.478553 C 37.993716,25.480234 38.294038,25.107558 38.243718,24.478553 L 38.118718,22.916053 L 39.984835,22.916053 C 40.797335,22.916053 40.975035,23.108616 41.172335,23.478553 L 41.672335,24.416053 C 42.199130,25.403793 43.483508,26.390165 42.170495,26.390165 C 37.667784,26.390165 13.993718,26.041053 11.743718,25.416053 z "
+ style="fill:url(#linearGradient1447);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.36571429" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="M 42.9375,26.5 L 4.8125,26.5"
+ id="path4760"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(0.000000,2.000000)"
+ style="opacity:0.43575415"
+ id="g4849">
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.29239765;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="rect4831"
+ width="19.000000"
+ height="1.0000000"
+ x="14.000000"
+ y="5.0000000" />
+ <rect
+ y="7.0000000"
+ x="14.000000"
+ height="1.0000000"
+ width="19.000000"
+ id="rect4833"
+ style="color:#000000;fill:#000000;fill-opacity:0.29239765;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.29239765;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="rect4835"
+ width="19.000000"
+ height="1.0000000"
+ x="14.000000"
+ y="9.0000000" />
+ <rect
+ y="11.000000"
+ x="14.000000"
+ height="1.0000000"
+ width="19.000000"
+ id="rect4837"
+ style="color:#000000;fill:#000000;fill-opacity:0.29239765;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.29239765;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="rect4839"
+ width="11.000000"
+ height="1.0000000"
+ x="14.000000"
+ y="13.000000" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="arrow">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path8643"
+ d="M 21.02159,20.989431 L 27.989391,20.989431 L 27.989391,16.064984 L 31,16.064984 L 24.553756,8 L 17.435622,15.986875 L 21.023684,15.986875 L 21.02159,20.989431 z "
+ style="opacity:1;color:#000000;fill:#a7a7a7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/download.svg b/apps/files_pdfviewer/js/pdfjs/web/images/download.svg
new file mode 100755
index 00000000000..2922c4331a7
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/download.svg
@@ -0,0 +1,619 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="document-save.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg2913"
+ height="48px"
+ width="48px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective104" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6925">
+ <stop
+ style="stop-color:#204a87;stop-opacity:1;"
+ offset="0"
+ id="stop6927" />
+ <stop
+ style="stop-color:#204a87;stop-opacity:0;"
+ offset="1"
+ id="stop6929" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6901">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop6903" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:0;"
+ offset="1"
+ id="stop6905" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4991">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4993" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4995" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4991"
+ id="radialGradient4997"
+ cx="23.447077"
+ cy="6.4576745"
+ fx="23.447077"
+ fy="6.4576745"
+ r="19.0625"
+ gradientTransform="matrix(-1.314471,-1.006312e-2,-1.022964e-2,1.336221,46.22108,-4.909887)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient2187"
+ inkscape:collect="always">
+ <stop
+ id="stop2189"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop2191"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2187"
+ id="linearGradient1764"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.914114,1.412791e-16,-1.412791e-16,0.914114,-3.868698,-2.706902)"
+ x1="33.059906"
+ y1="27.394117"
+ x2="12.624337"
+ y2="12.583769" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8662">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop8664" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop8666" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8662"
+ id="radialGradient8668"
+ cx="24.837126"
+ cy="36.421127"
+ fx="24.837126"
+ fy="36.421127"
+ r="15.644737"
+ gradientTransform="matrix(1.000000,-7.816467e-32,-1.132409e-32,0.536723,-5.897962e-14,16.87306)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient2555">
+ <stop
+ id="stop2557"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e6e6e6;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop2561" />
+ <stop
+ id="stop2563"
+ offset="0.75000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#e1e1e1;stop-opacity:1.0000000;"
+ offset="0.84166664"
+ id="stop2565" />
+ <stop
+ id="stop2559"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4274">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.25490198;"
+ offset="0.0000000"
+ id="stop4276" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4278" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4264"
+ inkscape:collect="always">
+ <stop
+ id="stop4266"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4268"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4254"
+ inkscape:collect="always">
+ <stop
+ id="stop4256"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop4258"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4244">
+ <stop
+ id="stop4246"
+ offset="0.0000000"
+ style="stop-color:#e4e4e4;stop-opacity:1.0000000;" />
+ <stop
+ id="stop4248"
+ offset="1.0000000"
+ style="stop-color:#d3d3d3;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4236"
+ inkscape:collect="always">
+ <stop
+ id="stop4238"
+ offset="0"
+ style="stop-color:#eeeeee;stop-opacity:1;" />
+ <stop
+ id="stop4240"
+ offset="1"
+ style="stop-color:#eeeeee;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4228">
+ <stop
+ id="stop4230"
+ offset="0.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ <stop
+ id="stop4232"
+ offset="1.0000000"
+ style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4184">
+ <stop
+ id="stop4186"
+ offset="0.0000000"
+ style="stop-color:#838383;stop-opacity:1.0000000;" />
+ <stop
+ id="stop4188"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0.795493,3.799180)"
+ y2="35.281250"
+ x2="24.687500"
+ y1="35.281250"
+ x1="7.0625000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4209"
+ xlink:href="#linearGradient4184"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="40.943935"
+ x2="36.183067"
+ y1="28.481176"
+ x1="7.6046205"
+ id="linearGradient4234"
+ xlink:href="#linearGradient4228"
+ inkscape:collect="always"
+ gradientTransform="translate(0.000000,5.125000)" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="33.758667"
+ x2="12.221823"
+ y1="37.205811"
+ x1="12.277412"
+ id="linearGradient4242"
+ xlink:href="#linearGradient4236"
+ inkscape:collect="always"
+ gradientTransform="translate(0.000000,5.125000)" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,0.248140)"
+ r="20.935817"
+ fy="2.9585190"
+ fx="15.571491"
+ cy="2.9585190"
+ cx="15.571491"
+ id="radialGradient4250"
+ xlink:href="#linearGradient4244"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="47.620636"
+ x2="44.096100"
+ y1="4.4331360"
+ x1="12.378357"
+ id="linearGradient4260"
+ xlink:href="#linearGradient4254"
+ inkscape:collect="always"
+ gradientTransform="translate(0.000000,5.125000)" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,-2.885063e-16,9.455693)"
+ r="23.555494"
+ fy="27.096155"
+ fx="23.201941"
+ cy="27.096155"
+ cx="23.201941"
+ id="radialGradient4270"
+ xlink:href="#linearGradient4264"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="26.357183"
+ x2="23.688078"
+ y1="11.318835"
+ x1="23.688078"
+ id="linearGradient4272"
+ xlink:href="#linearGradient4274"
+ inkscape:collect="always"
+ gradientTransform="translate(0.000000,5.125000)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2555"
+ id="linearGradient2553"
+ x1="33.431175"
+ y1="31.964777"
+ x2="21.747974"
+ y2="11.780679"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6901"
+ id="linearGradient6907"
+ x1="14.751649"
+ y1="15.868432"
+ x2="8.8953285"
+ y2="16.743431"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6925"
+ id="linearGradient6931"
+ x1="12.25"
+ y1="18.25"
+ x2="7"
+ y2="21.118431"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="30"
+ inkscape:window-x="0"
+ inkscape:window-height="818"
+ inkscape:window-width="999"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer2"
+ inkscape:cy="11.891468"
+ inkscape:cx="-133.68151"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="0.22745098"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:showpageshadow="false"
+ fill="#3465a4"
+ stroke="#204a87" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Save</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>hdd</rdf:li>
+ <rdf:li>hard drive</rdf:li>
+ <rdf:li>save</rdf:li>
+ <rdf:li>io</rdf:li>
+ <rdf:li>store</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:identifier />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="pix"
+ id="layer2"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.411405e-2,0,0,1.929202e-2,45.48953,41.75228)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccsccccccccc"
+ id="path4196"
+ d="M 11.28569,13.087628 C 10.66069,13.087628 10.254441,13.377808 10.004442,13.931381 C 10.004441,13.931381 3.5356915,31.034938 3.5356915,31.034938 C 3.5356915,31.034938 3.2856915,31.706497 3.2856915,32.816188 C 3.2856915,32.816188 3.2856915,42.466156 3.2856915,42.466156 C 3.2856915,43.548769 3.943477,44.091158 4.9419415,44.091156 L 43.50444,44.091156 C 44.489293,44.091156 45.09819,43.372976 45.09819,42.247406 L 45.09819,32.597438 C 45.09819,32.597438 45.204153,31.827015 45.00444,31.284938 L 38.28569,14.087631 C 38.101165,13.575725 37.648785,13.099533 37.16069,13.087628 L 11.28569,13.087628 z "
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#535353;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4170"
+ d="M 3.2735915,32.121812 L 4.0381936,31.429597 L 41.647883,31.492097 L 45.11029,31.809395 L 45.11029,42.247927 C 45.11029,43.373496 44.503272,44.091258 43.518419,44.091258 L 4.9354314,44.091258 C 3.9369667,44.091258 3.2735915,43.549207 3.2735915,42.466594 L 3.2735915,32.121812 z "
+ style="fill:url(#linearGradient4234);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02044296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csccccccs"
+ id="path3093"
+ d="M 3.5490842,31.039404 C 2.8347985,32.50369 3.5484686,33.432261 4.5847985,33.432261 C 4.5847985,33.432261 43.584797,33.432261 43.584797,33.432261 C 44.703844,33.408451 45.430035,32.420356 45.013368,31.289403 L 38.299082,14.078704 C 38.114558,13.566798 37.64432,13.090606 37.156225,13.078701 L 11.299083,13.078701 C 10.674083,13.078701 10.263369,13.382274 10.01337,13.935847 C 10.01337,13.935847 3.5490842,31.039404 3.5490842,31.039404 z "
+ style="fill:url(#radialGradient4250);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="36.299183"
+ x="7.857996"
+ height="5.5625"
+ width="17.625"
+ id="rect4174"
+ style="opacity:1;color:#000000;fill:url(#linearGradient4209);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.40899992;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cscc"
+ id="path4194"
+ d="M 7.8579947,41.86168 C 7.8579947,41.86168 7.8579947,37.850195 7.8579947,37.850195 C 9.6935221,41.029421 16.154485,41.86168 20.795492,41.86168 C 20.795492,41.86168 7.8579947,41.86168 7.8579947,41.86168 z "
+ style="opacity:0.81142853;fill:url(#linearGradient4242);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4201"
+ d="M 44.796162,30.753688 C 44.859684,32.003662 44.382159,33.069528 43.474046,33.097438 C 43.474046,33.097438 5.3553296,33.097437 5.3553297,33.097438 C 4.0660978,33.097438 3.4875937,32.772491 3.271279,32.229382 C 3.3630404,33.173714 4.0970964,33.878688 5.3553297,33.878688 C 5.3553296,33.878687 43.474046,33.878688 43.474046,33.878688 C 44.550053,33.845617 45.226851,32.454664 44.82621,30.883897 L 44.796162,30.753688 z "
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path4211"
+ d="M 10.96875,15.28125 C 10.922675,15.481571 10.78125,15.668047 10.78125,15.875 C 10.78125,16.823605 11.37223,17.664474 12.125,18.46875 C 12.365268,18.314675 12.490117,18.114342 12.75,17.96875 C 11.809691,17.152746 11.196604,16.252168 10.96875,15.28125 z M 37.625,15.28125 C 37.396273,16.250866 36.782988,17.153676 35.84375,17.96875 C 36.117894,18.122332 36.247738,18.33699 36.5,18.5 C 37.257262,17.693344 37.8125,16.826956 37.8125,15.875 C 37.8125,15.668047 37.670906,15.481571 37.625,15.28125 z M 39.8125,23.71875 C 39.198709,27.758861 32.513887,30.96875 24.28125,30.96875 C 16.068996,30.968751 9.4211001,27.775964 8.78125,23.75 C 8.7488928,23.947132 8.65625,24.141882 8.65625,24.34375 C 8.6562503,28.661697 15.645354,32.187501 24.28125,32.1875 C 32.917146,32.1875 39.937499,28.661698 39.9375,24.34375 C 39.9375,24.130826 39.848449,23.926394 39.8125,23.71875 z "
+ style="opacity:0.69142857;color:#000000;fill:url(#linearGradient4272);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ transform="translate(8.838843e-2,5.301780)"
+ d="M 8.5736699 25.593554 A 1.3700194 1.016466 0 1 1 5.833631,25.593554 A 1.3700194 1.016466 0 1 1 8.5736699 25.593554 z"
+ sodipodi:ry="1.016466"
+ sodipodi:rx="1.3700194"
+ sodipodi:cy="25.593554"
+ sodipodi:cx="7.2036505"
+ id="path4224"
+ style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4226"
+ sodipodi:cx="7.2036505"
+ sodipodi:cy="25.593554"
+ sodipodi:rx="1.3700194"
+ sodipodi:ry="1.016466"
+ d="M 8.5736699 25.593554 A 1.3700194 1.016466 0 1 1 5.833631,25.593554 A 1.3700194 1.016466 0 1 1 8.5736699 25.593554 z"
+ transform="translate(33.96705,5.213390)" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4260);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 11.642515,13.540723 C 11.040823,13.540723 10.649724,13.820081 10.409049,14.35301 C 10.409048,14.35301 3.9940341,30.943732 3.9940341,30.943732 C 3.9940341,30.943732 3.7533573,31.590247 3.7533573,32.658555 C 3.7533573,32.658555 3.7533573,41.948651 3.7533573,41.948651 C 3.7533573,43.303391 4.1974134,43.57555 5.3478414,43.57555 L 43.034746,43.57555 C 44.357872,43.57555 44.569062,43.259153 44.569062,41.738058 L 44.569062,32.447962 C 44.569062,32.447962 44.671072,31.706271 44.478807,31.184409 L 37.885616,14.378434 C 37.707973,13.885617 37.334964,13.552184 36.865071,13.540723 L 11.642515,13.540723 z "
+ id="path4252"
+ sodipodi:nodetypes="cccsccccccccc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
+ d="M 40.5,36.554166 L 40.5,41.575101"
+ id="path4282" />
+ <path
+ id="path4284"
+ d="M 38.5,36.613943 L 38.5,41.634878"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
+ d="M 36.5,36.613943 L 36.5,41.634878"
+ id="path4286" />
+ <path
+ id="path4288"
+ d="M 34.5,36.613943 L 34.5,41.634878"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
+ d="M 32.5,36.613943 L 32.5,41.634878"
+ id="path4290" />
+ <path
+ id="path4292"
+ d="M 30.5,36.613943 L 30.5,41.634878"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
+ <path
+ id="path4294"
+ d="M 39.5,36.604065 L 39.5,41.625"
+ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 37.5,36.663842 L 37.5,41.684777"
+ id="path4296" />
+ <path
+ id="path4298"
+ d="M 35.5,36.663842 L 35.5,41.684777"
+ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 33.5,36.663842 L 33.5,41.684777"
+ id="path4300" />
+ <path
+ id="path4302"
+ d="M 31.5,36.663842 L 31.5,41.684777"
+ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path4572"
+ d="M 7.875,36.3125 L 7.875,41.84375 L 20.4375,41.84375 L 8.21875,41.5 L 7.875,36.3125 z "
+ style="opacity:0.43999999;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.20571427;color:#000000;fill:url(#linearGradient2553);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93365198;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible"
+ id="path2545"
+ sodipodi:cx="25"
+ sodipodi:cy="19.5625"
+ sodipodi:rx="14.875"
+ sodipodi:ry="6.6875"
+ d="M 39.875 19.5625 A 14.875 6.6875 0 1 1 10.125,19.5625 A 14.875 6.6875 0 1 1 39.875 19.5625 z"
+ transform="matrix(1.037815,0.000000,0.000000,1.060747,-1.632878,3.030370)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="down">
+ <path
+ transform="matrix(1.130190,1.178179e-16,7.918544e-17,-0.759601,-3.909725,53.66554)"
+ d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
+ sodipodi:ry="8.3968935"
+ sodipodi:rx="15.644737"
+ sodipodi:cy="36.421127"
+ sodipodi:cx="24.837126"
+ id="path8660"
+ style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ style="opacity:1;color:#000000;fill:url(#linearGradient6907);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient6931);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ d="M 3.2034501,25.835194 C 2.1729477,-5.3853369 28.741616,-0.4511153 28.582416,15.788689 L 35.89533,15.788689 L 24.517652,28.774671 L 12.585426,15.788689 C 12.585426,15.788689 20.126859,15.788689 20.126859,15.788689 C 20.583921,4.8193225 3.4092324,1.6100346 3.2034501,25.835194 z "
+ id="path1432"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path2177"
+ d="M 7.6642103,9.1041047 C 12.40638,-0.0400306 28.122336,2.7175443 27.761604,16.579393 L 34.078976,16.579393 C 34.078976,16.579393 24.513151,27.536769 24.513151,27.536769 L 14.41668,16.579393 C 14.41668,16.579393 20.87332,16.579393 20.87332,16.579393 C 21.144975,5.0041615 10.922265,5.5345215 7.6642103,9.1041047 z "
+ style="opacity:0.47159091;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.99999934;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
+ <path
+ style="opacity:0.49431817;color:#000000;fill:url(#radialGradient4997);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 34.767155,16.211613 L 32.782979,18.757322 C 27.372947,17.241029 24.896829,21.486664 17.109284,20.489112 L 13.247998,16.080077 L 20.434468,16.162862 C 20.483219,4.3164571 8.3443098,4.998966 5.0292663,13.627829 C 8.8372201,-1.2611216 27.893316,0.8064118 28.28332,16.114112 L 34.767155,16.211613 z "
+ id="path4989"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/go-down.svg b/apps/files_pdfviewer/js/pdfjs/web/images/go-down.svg
new file mode 100755
index 00000000000..95b82afd11f
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/go-down.svg
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="go-down.svg"
+ sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg11300"
+ height="48px"
+ width="48px"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective24" />
+ <linearGradient
+ id="linearGradient1442">
+ <stop
+ id="stop1444"
+ offset="0"
+ style="stop-color:#73d216" />
+ <stop
+ id="stop1446"
+ offset="1.0000000"
+ style="stop-color:#4e9a06" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8662"
+ inkscape:collect="always">
+ <stop
+ id="stop8664"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop8666"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8650"
+ inkscape:collect="always">
+ <stop
+ id="stop8652"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop8654"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8662"
+ id="radialGradient1444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
+ cx="24.837126"
+ cy="36.421127"
+ fx="24.837126"
+ fy="36.421127"
+ r="15.644737" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1442"
+ id="radialGradient1469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
+ cx="35.292667"
+ cy="20.494493"
+ fx="35.292667"
+ fy="20.494493"
+ r="16.956199" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8650"
+ id="radialGradient1471"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.749427e-16,-2.046729,-1.557610,-2.853404e-16,44.11559,66.93275)"
+ cx="15.987216"
+ cy="1.5350308"
+ fx="15.987216"
+ fy="1.5350308"
+ r="17.171415" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="30"
+ inkscape:window-x="0"
+ inkscape:window-height="818"
+ inkscape:window-width="1280"
+ inkscape:showpageshadow="false"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="23.239067"
+ inkscape:cx="15.972815"
+ inkscape:zoom="11.313708"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="0.25490196"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ fill="#4e9a06"
+ stroke="#4e9a06" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title>Go Down</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>go</rdf:li>
+ <rdf:li>lower</rdf:li>
+ <rdf:li>down</rdf:li>
+ <rdf:li>arrow</rdf:li>
+ <rdf:li>pointer</rdf:li>
+ <rdf:li>&gt;</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <path
+ transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
+ d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
+ sodipodi:ry="8.3968935"
+ sodipodi:rx="15.644737"
+ sodipodi:cy="36.421127"
+ sodipodi:cx="24.837126"
+ id="path8660"
+ style="opacity:0.20454545;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <g
+ id="g1464"
+ transform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.02856,43.99921)">
+ <path
+ style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1469);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 14.519136,38.500000 L 32.524165,38.496094 L 32.524165,25.504468 L 40.519531,25.496656 L 23.374809,5.4992135 L 6.5285585,25.497284 L 14.524440,25.501074 L 14.519136,38.500000 z "
+ id="path8643"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1471);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 39.429889,24.993467 L 32.023498,25.005186 L 32.026179,37.998023 L 16.647623,37.98887 C 17.417545,19.64788 27.370272,26.995797 32.029282,16.341991 L 39.429889,24.993467 z "
+ id="path8645"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path8658"
+ d="M 15.520704,37.496094 L 31.522109,37.500000 L 31.522109,24.507050 L 38.338920,24.491425 L 23.384644,7.0388396 L 8.6781173,24.495782 L 15.518018,24.501029 L 15.520704,37.496094 z "
+ style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/go-up.svg b/apps/files_pdfviewer/js/pdfjs/web/images/go-up.svg
new file mode 100755
index 00000000000..54263df3e53
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/go-up.svg
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="go-up.svg"
+ sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg11300"
+ height="48px"
+ width="48px"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective23" />
+ <linearGradient
+ id="linearGradient2304">
+ <stop
+ id="stop2306"
+ offset="0"
+ style="stop-color:#73d216" />
+ <stop
+ id="stop2308"
+ offset="1.0000000"
+ style="stop-color:#4e9a06" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8662"
+ inkscape:collect="always">
+ <stop
+ id="stop8664"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop8666"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8650"
+ inkscape:collect="always">
+ <stop
+ id="stop8652"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop8654"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8650"
+ id="radialGradient1438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-3.749427e-16,-2.046729,1.557610,-2.853404e-16,2.767009,66.93275)"
+ cx="24.53788"
+ cy="0.40010813"
+ fx="24.53788"
+ fy="0.40010813"
+ r="17.171415" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2304"
+ id="radialGradient1441"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
+ cx="11.319205"
+ cy="22.454971"
+ fx="11.319205"
+ fy="22.454971"
+ r="16.956199" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8662"
+ id="radialGradient1444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
+ cx="24.837126"
+ cy="36.421127"
+ fx="24.837126"
+ fy="36.421127"
+ r="15.644737" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="30"
+ inkscape:window-x="0"
+ inkscape:window-height="818"
+ inkscape:window-width="1280"
+ inkscape:showpageshadow="false"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="25.620377"
+ inkscape:cx="9.6380363"
+ inkscape:zoom="13.059378"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="0.25490196"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ fill="#73d216"
+ stroke="#73d216" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title>Go Up</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>go</rdf:li>
+ <rdf:li>higher</rdf:li>
+ <rdf:li>up</rdf:li>
+ <rdf:li>arrow</rdf:li>
+ <rdf:li>pointer</rdf:li>
+ <rdf:li>&gt;</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <path
+ transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
+ d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
+ sodipodi:ry="8.3968935"
+ sodipodi:rx="15.644737"
+ sodipodi:cy="36.421127"
+ sodipodi:cx="24.837126"
+ id="path8660"
+ style="opacity:0.29946521;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path8643"
+ d="M 14.491792,38.500000 L 32.469477,38.500000 L 32.469477,25.547437 L 40.500000,25.547437 L 23.374809,5.4992135 L 6.5285585,25.489471 L 14.497096,25.555762 L 14.491792,38.500000 z "
+ style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1441);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccscc"
+ id="path8645"
+ d="M 7.5855237,25.03253 L 14.995821,25.03253 L 15.062422,31.594339 C 20.718034,20.593878 31.055517,22.749928 31.656768,15.966674 C 31.656768,15.966674 23.366938,6.4219692 23.366938,6.4219692 L 7.5855237,25.03253 z "
+ style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1438);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 15.602735,37.500000 L 31.502578,37.500000 L 31.502578,24.507050 L 38.311576,24.507050 L 23.361206,7.0700896 L 8.6546798,24.550470 L 15.475049,24.528373 L 15.602735,37.500000 z "
+ id="path8658"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/nav-outline.svg b/apps/files_pdfviewer/js/pdfjs/web/images/nav-outline.svg
new file mode 100755
index 00000000000..4d4323ce37e
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/nav-outline.svg
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3007"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="nav-outline.svg">
+ <defs
+ id="defs3009">
+ <filter
+ inkscape:collect="always"
+ id="filter5333"
+ x="-0.16623206"
+ width="1.3324641"
+ y="-0.030014125"
+ height="1.0600282">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.47888561"
+ id="feGaussianBlur5335" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.945051"
+ inkscape:cx="20.614872"
+ inkscape:cy="23.423899"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1440"
+ inkscape:window-height="773"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3012">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#f0f0f0;fill-rule:evenodd;stroke:#808080;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+ id="rect3783"
+ width="46.16272"
+ height="45.59861"
+ x="1.0341953"
+ y="0.99112236" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect3787"
+ width="2.8205326"
+ height="2.7823999"
+ x="4.2307992"
+ y="4.093708" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5257"
+ width="24.68285"
+ height="1.4102663"
+ x="8.0855274"
+ y="4.657815" />
+ <rect
+ y="8.4185247"
+ x="8.4615984"
+ height="2.7823999"
+ width="2.8205326"
+ id="rect5259"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ y="9.0766497"
+ x="12.410344"
+ height="1.4102663"
+ width="30.498053"
+ id="rect5261"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5263"
+ width="2.8205326"
+ height="2.7823999"
+ x="8.4615984"
+ y="13.307448" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5265"
+ width="24.972752"
+ height="1.4102663"
+ x="12.410344"
+ y="13.965573" />
+ <rect
+ y="17.444229"
+ x="4.3248172"
+ height="2.7823999"
+ width="2.8205326"
+ id="rect5267"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ y="18.008337"
+ x="8.1795454"
+ height="1.4102663"
+ width="25.101433"
+ id="rect5269"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5271"
+ width="2.8205326"
+ height="2.7823999"
+ x="8.5556164"
+ y="21.769047" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5273"
+ width="28.782515"
+ height="1.4102663"
+ x="12.880433"
+ y="22.427172" />
+ <rect
+ y="26.65797"
+ x="13.475181"
+ height="2.7823999"
+ width="2.8205326"
+ id="rect5275"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ y="27.316095"
+ x="17.479"
+ height="1.4102663"
+ width="23.681646"
+ id="rect5277"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5279"
+ width="2.8205326"
+ height="2.7823999"
+ x="8.5130949"
+ y="31.006269" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5281"
+ width="24.557148"
+ height="1.4102663"
+ x="12.592034"
+ y="31.636858" />
+ <rect
+ y="35.464046"
+ x="13.475181"
+ height="2.7823999"
+ width="2.8205326"
+ id="rect5283"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ y="36.055695"
+ x="17.744923"
+ height="1.4102663"
+ width="18.577394"
+ id="rect5285"
+ style="fill:#404040;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5287"
+ width="2.8205326"
+ height="2.7823999"
+ x="13.54166"
+ y="40.35297" />
+ <rect
+ style="fill:#404040;fill-opacity:1;stroke:none"
+ id="rect5289"
+ width="23.080858"
+ height="1.4102663"
+ x="17.678442"
+ y="40.944618" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/nav-thumbs.svg b/apps/files_pdfviewer/js/pdfjs/web/images/nav-thumbs.svg
new file mode 100755
index 00000000000..8737b8cb633
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/nav-thumbs.svg
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3007"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="nav-thumbs.svg">
+ <defs
+ id="defs3009">
+ <filter
+ inkscape:collect="always"
+ id="filter5333"
+ x="-0.16623206"
+ width="1.3324641"
+ y="-0.030014125"
+ height="1.0600282">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.47888561"
+ id="feGaussianBlur5335" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter5966">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.3570515"
+ id="feGaussianBlur5968" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.945051"
+ inkscape:cx="9.375932"
+ inkscape:cy="24.942259"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1440"
+ inkscape:window-height="773"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3012">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#484848;fill-rule:evenodd;stroke:#808080;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
+ id="rect3783"
+ width="46.16272"
+ height="45.59861"
+ x="1.0341953"
+ y="0.99112236" />
+ <rect
+ y="4.7876148"
+ x="14.359808"
+ height="12.764274"
+ width="9.7061672"
+ id="rect5960"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter5966)"
+ transform="matrix(1.0465713,0,0,1.0642851,3.6426579,-2.1141417)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect5958"
+ width="9.7061672"
+ height="12.764274"
+ x="18.897236"
+ y="3.1920807" />
+ <rect
+ transform="matrix(1.0465713,0,0,1.0642851,3.6426579,13.043433)"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter5966)"
+ id="rect5970"
+ width="9.7061672"
+ height="12.764274"
+ x="14.359808"
+ y="4.7876148" />
+ <rect
+ y="18.349655"
+ x="18.897236"
+ height="12.764274"
+ width="9.7061672"
+ id="rect5972"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ y="4.7876148"
+ x="14.359808"
+ height="12.764274"
+ width="9.7061672"
+ id="rect5974"
+ style="fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter5966)"
+ transform="matrix(1.0465713,0,0,0.9368834,3.6426579,29.209842)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect5976"
+ width="9.7061672"
+ height="11.833546"
+ x="18.897236"
+ y="33.906113" />
+ <rect
+ y="4.905829"
+ x="19.960924"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect5995"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6177"
+ width="3.6219761"
+ height="0.66480595"
+ x="19.960924"
+ y="6.0340419" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6179"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.960924"
+ y="7.2562728" />
+ <rect
+ y="8.3844862"
+ x="19.960924"
+ height="0.66480595"
+ width="5.6903667"
+ id="rect6181"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ y="9.7007341"
+ x="19.960924"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect6183"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6185"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.960924"
+ y="10.828948" />
+ <rect
+ y="12.051179"
+ x="19.960924"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect6187"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ y="14.213587"
+ x="23.204536"
+ height="0.66480595"
+ width="1.2245234"
+ id="rect6189"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6209"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.772888"
+ y="19.854652" />
+ <rect
+ y="39.08128"
+ x="19.913914"
+ height="0.66480595"
+ width="3.6219761"
+ id="rect6211"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ y="22.205095"
+ x="19.772888"
+ height="0.66480595"
+ width="6.6305442"
+ id="rect6213"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6215"
+ width="7.7587576"
+ height="0.66480595"
+ x="19.866905"
+ y="37.859051" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6217"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.772888"
+ y="21.029873" />
+ <rect
+ y="25.777771"
+ x="19.772888"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect6219"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6221"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.772888"
+ y="27.000002" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6223"
+ width="1.2245234"
+ height="0.66480595"
+ x="23.204536"
+ y="28.974375" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6225"
+ width="3.6219761"
+ height="0.66480595"
+ x="19.960922"
+ y="42.983021" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6227"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.913914"
+ y="36.777847" />
+ <rect
+ y="35.602627"
+ x="19.913914"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect6231"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ id="rect6233"
+ width="7.7117486"
+ height="0.66480595"
+ x="19.913914"
+ y="40.350525" />
+ <rect
+ y="41.572754"
+ x="19.913914"
+ height="0.66480595"
+ width="7.7117486"
+ id="rect6235"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#0000e6;fill-opacity:0.44444448;stroke:none"
+ id="rect6237"
+ width="3.5256658"
+ height="1.927364"
+ x="22.077036"
+ y="23.367346" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/zoom-in.svg b/apps/files_pdfviewer/js/pdfjs/web/images/zoom-in.svg
new file mode 100755
index 00000000000..6eaed448110
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/zoom-in.svg
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg6431"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ sodipodi:docname="list-add.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs6433">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective70" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2091">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2093" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2095" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7916">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7918" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.34020618;"
+ offset="1.0000000"
+ id="stop7920" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8662">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop8664" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop8666" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8662"
+ id="radialGradient1503"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.018989e-13,16.87306)"
+ cx="24.837126"
+ cy="36.421127"
+ fx="24.837126"
+ fy="36.421127"
+ r="15.644737" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2847">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2849" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:0;"
+ offset="1"
+ id="stop2851" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2847"
+ id="linearGradient1488"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,-1.242480,40.08170)"
+ x1="37.128052"
+ y1="29.729605"
+ x2="37.065414"
+ y2="26.194071" />
+ <linearGradient
+ id="linearGradient2831">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2833" />
+ <stop
+ id="stop2855"
+ offset="0.33333334"
+ style="stop-color:#5b86be;stop-opacity:1;" />
+ <stop
+ style="stop-color:#83a8d8;stop-opacity:0;"
+ offset="1"
+ id="stop2835" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2831"
+ id="linearGradient1486"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.30498,-6.043298)"
+ x1="13.478554"
+ y1="10.612206"
+ x2="15.419417"
+ y2="19.115122" />
+ <linearGradient
+ id="linearGradient2380">
+ <stop
+ style="stop-color:#b9cfe7;stop-opacity:1"
+ offset="0"
+ id="stop2382" />
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1"
+ offset="1"
+ id="stop2384" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2682">
+ <stop
+ style="stop-color:#3977c3;stop-opacity:1;"
+ offset="0"
+ id="stop2684" />
+ <stop
+ style="stop-color:#89aedc;stop-opacity:0;"
+ offset="1"
+ id="stop2686" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2682"
+ id="linearGradient2688"
+ x1="36.713837"
+ y1="31.455952"
+ x2="37.124462"
+ y2="24.842253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.77039,-5.765705)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2690">
+ <stop
+ style="stop-color:#c4d7eb;stop-opacity:1;"
+ offset="0"
+ id="stop2692" />
+ <stop
+ style="stop-color:#c4d7eb;stop-opacity:0;"
+ offset="1"
+ id="stop2694" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2690"
+ id="linearGradient2696"
+ x1="32.647972"
+ y1="30.748846"
+ x2="37.124462"
+ y2="24.842253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.77039,-5.765705)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2871">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2873" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1"
+ offset="1"
+ id="stop2875" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2402">
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1;"
+ offset="0"
+ id="stop2404" />
+ <stop
+ style="stop-color:#528ac5;stop-opacity:1;"
+ offset="1"
+ id="stop2406" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2797"
+ id="linearGradient1493"
+ gradientUnits="userSpaceOnUse"
+ x1="5.9649176"
+ y1="26.048164"
+ x2="52.854097"
+ y2="26.048164" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2797">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2799" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2801" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2797"
+ id="linearGradient1491"
+ gradientUnits="userSpaceOnUse"
+ x1="5.9649176"
+ y1="26.048164"
+ x2="52.854097"
+ y2="26.048164" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7179">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7181" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7183" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2316">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2318" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.65979379;"
+ offset="1"
+ id="stop2320" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1322">
+ <stop
+ id="stop1324"
+ offset="0.0000000"
+ style="stop-color:#729fcf" />
+ <stop
+ id="stop1326"
+ offset="1.0000000"
+ style="stop-color:#5187d6;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1322"
+ id="linearGradient4975"
+ x1="34.892849"
+ y1="36.422989"
+ x2="45.918697"
+ y2="48.547989"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-18.01785,-13.57119)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7179"
+ id="linearGradient7185"
+ x1="13.435029"
+ y1="13.604306"
+ x2="22.374878"
+ y2="23.554308"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7179"
+ id="linearGradient7189"
+ gradientUnits="userSpaceOnUse"
+ x1="13.435029"
+ y1="13.604306"
+ x2="22.374878"
+ y2="23.554308"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.93934,50.02474)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2380"
+ id="linearGradient7180"
+ gradientUnits="userSpaceOnUse"
+ x1="62.513836"
+ y1="36.061237"
+ x2="15.984863"
+ y2="20.60858" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2871"
+ id="linearGradient7182"
+ gradientUnits="userSpaceOnUse"
+ x1="46.834816"
+ y1="45.264122"
+ x2="45.380436"
+ y2="50.939667" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2402"
+ id="linearGradient7184"
+ gradientUnits="userSpaceOnUse"
+ x1="18.935766"
+ y1="23.667896"
+ x2="53.588622"
+ y2="26.649362" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2871"
+ id="linearGradient7186"
+ gradientUnits="userSpaceOnUse"
+ x1="46.834816"
+ y1="45.264122"
+ x2="45.380436"
+ y2="50.939667" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7916"
+ id="linearGradient7922"
+ x1="16.874998"
+ y1="22.851799"
+ x2="27.900846"
+ y2="34.976799"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2091"
+ id="radialGradient2097"
+ cx="23.070683"
+ cy="35.127438"
+ fx="23.070683"
+ fy="35.127438"
+ r="10.319340"
+ gradientTransform="matrix(0.914812,1.265023e-2,-8.21502e-3,0.213562,2.253914,27.18889)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.15686275"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-123.56934"
+ inkscape:cy="0.031886897"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1280"
+ inkscape:window-height="818"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata6436">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Add</dc:title>
+ <dc:date>2006-01-04</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://tango-project.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>add</rdf:li>
+ <rdf:li>plus</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.10824742;fill:url(#radialGradient2097);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path1361"
+ sodipodi:cx="22.958872"
+ sodipodi:cy="34.94062"
+ sodipodi:rx="10.31934"
+ sodipodi:ry="2.320194"
+ d="M 33.278212 34.94062 A 10.31934 2.320194 0 1 1 12.639532,34.94062 A 10.31934 2.320194 0 1 1 33.278212 34.94062 z"
+ transform="matrix(1.550487,0,0,1.978714,-12.4813,-32.49103)" />
+ <path
+ style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#75a1d0;fill-opacity:1.0000000;stroke:#3465a4;stroke-width:1.0000004px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+ d="M 27.514356,37.542682 L 27.514356,28.515722 L 37.492820,28.475543 L 37.492820,21.480219 L 27.523285,21.480219 L 27.514356,11.520049 L 20.498082,11.531210 L 20.502546,21.462362 L 10.512920,21.536022 L 10.477206,28.504561 L 20.511475,28.475543 L 20.518171,37.515896 L 27.514356,37.542682 z "
+ id="text1314"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;opacity:0.40860215;fill:url(#linearGradient4975);fill-opacity:1.0000000;stroke:url(#linearGradient7922);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+ d="M 26.498702,36.533920 L 26.498702,27.499738 L 36.501304,27.499738 L 36.494607,22.475309 L 26.507630,22.475309 L 26.507630,12.480335 L 21.512796,12.498193 L 21.521725,22.475309 L 11.495536,22.493166 L 11.468750,27.466256 L 21.533143,27.475185 L 21.519750,36.502670 L 26.498702,36.533920 z "
+ id="path7076"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.31182796"
+ d="M 11.000000,25.000000 C 11.000000,26.937500 36.984375,24.031250 36.984375,24.968750 L 36.984375,21.968750 L 27.000000,22.000000 L 27.000000,12.034772 L 21.000000,12.034772 L 21.000000,22.000000 L 11.000000,22.000000 L 11.000000,25.000000 z "
+ id="path7914"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfjs/web/images/zoom-out.svg b/apps/files_pdfviewer/js/pdfjs/web/images/zoom-out.svg
new file mode 100755
index 00000000000..5f109a05c38
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/web/images/zoom-out.svg
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg6431"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ sodipodi:docname="list-remove.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs6433">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective69" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2091">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2093" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2095" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2091"
+ id="radialGradient2097"
+ cx="23.070683"
+ cy="35.127438"
+ fx="23.070683"
+ fy="35.127438"
+ r="10.319340"
+ gradientTransform="matrix(0.914812,1.265023e-2,-8.21502e-3,0.213562,2.253914,27.18889)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient7916">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7918" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.34020618;"
+ offset="1.0000000"
+ id="stop7920" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8662">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop8664" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop8666" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8662"
+ id="radialGradient1503"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.018989e-13,16.87306)"
+ cx="24.837126"
+ cy="36.421127"
+ fx="24.837126"
+ fy="36.421127"
+ r="15.644737" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2847">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2849" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:0;"
+ offset="1"
+ id="stop2851" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2847"
+ id="linearGradient1488"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,-1.242480,40.08170)"
+ x1="37.128052"
+ y1="29.729605"
+ x2="37.065414"
+ y2="26.194071" />
+ <linearGradient
+ id="linearGradient2831">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2833" />
+ <stop
+ id="stop2855"
+ offset="0.33333334"
+ style="stop-color:#5b86be;stop-opacity:1;" />
+ <stop
+ style="stop-color:#83a8d8;stop-opacity:0;"
+ offset="1"
+ id="stop2835" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2831"
+ id="linearGradient1486"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.30498,-6.043298)"
+ x1="13.478554"
+ y1="10.612206"
+ x2="15.419417"
+ y2="19.115122" />
+ <linearGradient
+ id="linearGradient2380">
+ <stop
+ style="stop-color:#b9cfe7;stop-opacity:1"
+ offset="0"
+ id="stop2382" />
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1"
+ offset="1"
+ id="stop2384" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2682">
+ <stop
+ style="stop-color:#3977c3;stop-opacity:1;"
+ offset="0"
+ id="stop2684" />
+ <stop
+ style="stop-color:#89aedc;stop-opacity:0;"
+ offset="1"
+ id="stop2686" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2682"
+ id="linearGradient2688"
+ x1="36.713837"
+ y1="31.455952"
+ x2="37.124462"
+ y2="24.842253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.77039,-5.765705)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2690">
+ <stop
+ style="stop-color:#c4d7eb;stop-opacity:1;"
+ offset="0"
+ id="stop2692" />
+ <stop
+ style="stop-color:#c4d7eb;stop-opacity:0;"
+ offset="1"
+ id="stop2694" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2690"
+ id="linearGradient2696"
+ x1="32.647972"
+ y1="30.748846"
+ x2="37.124462"
+ y2="24.842253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-48.77039,-5.765705)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2871">
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0"
+ id="stop2873" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1"
+ offset="1"
+ id="stop2875" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2402">
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1;"
+ offset="0"
+ id="stop2404" />
+ <stop
+ style="stop-color:#528ac5;stop-opacity:1;"
+ offset="1"
+ id="stop2406" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2797"
+ id="linearGradient1493"
+ gradientUnits="userSpaceOnUse"
+ x1="5.9649176"
+ y1="26.048164"
+ x2="52.854097"
+ y2="26.048164" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2797">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2799" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2801" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2797"
+ id="linearGradient1491"
+ gradientUnits="userSpaceOnUse"
+ x1="5.9649176"
+ y1="26.048164"
+ x2="52.854097"
+ y2="26.048164" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7179">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7181" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7183" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2316">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2318" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.65979379;"
+ offset="1"
+ id="stop2320" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1322">
+ <stop
+ id="stop1324"
+ offset="0.0000000"
+ style="stop-color:#729fcf" />
+ <stop
+ id="stop1326"
+ offset="1.0000000"
+ style="stop-color:#5187d6;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1322"
+ id="linearGradient4975"
+ x1="34.892849"
+ y1="36.422989"
+ x2="45.918697"
+ y2="48.547989"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-18.01785,-13.57119)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7179"
+ id="linearGradient7185"
+ x1="13.435029"
+ y1="13.604306"
+ x2="22.374878"
+ y2="23.554308"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7179"
+ id="linearGradient7189"
+ gradientUnits="userSpaceOnUse"
+ x1="13.435029"
+ y1="13.604306"
+ x2="22.374878"
+ y2="23.554308"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.93934,50.02474)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2380"
+ id="linearGradient7180"
+ gradientUnits="userSpaceOnUse"
+ x1="62.513836"
+ y1="36.061237"
+ x2="15.984863"
+ y2="20.60858" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2871"
+ id="linearGradient7182"
+ gradientUnits="userSpaceOnUse"
+ x1="46.834816"
+ y1="45.264122"
+ x2="45.380436"
+ y2="50.939667" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2402"
+ id="linearGradient7184"
+ gradientUnits="userSpaceOnUse"
+ x1="18.935766"
+ y1="23.667896"
+ x2="53.588622"
+ y2="26.649362" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2871"
+ id="linearGradient7186"
+ gradientUnits="userSpaceOnUse"
+ x1="46.834816"
+ y1="45.264122"
+ x2="45.380436"
+ y2="50.939667" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7916"
+ id="linearGradient7922"
+ x1="16.874998"
+ y1="22.851799"
+ x2="27.900846"
+ y2="34.976799"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.10980392"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-123.27226"
+ inkscape:cy="26.474252"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1280"
+ inkscape:window-height="818"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata6436">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Remove</dc:title>
+ <dc:date>2006-01-04</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://tango-project.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>remove</rdf:li>
+ <rdf:li>delete</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#75a1d0;fill-opacity:1.0000000;stroke:#3465a4;stroke-width:1.0000004px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+ d="M 27.514356,28.359472 L 39.633445,28.475543 L 39.633445,21.480219 L 27.523285,21.480219 L 20.502546,21.462362 L 8.5441705,21.489147 L 8.5084565,28.457686 L 20.511475,28.475543 L 27.514356,28.359472 z "
+ id="text1314"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;opacity:0.40860215;fill:url(#linearGradient4975);fill-opacity:1.0000000;stroke:url(#linearGradient7922);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
+ d="M 38.579429,27.484113 L 38.588357,22.475309 L 9.5267863,22.493166 L 9.5000003,27.466256 L 38.579429,27.484113 z "
+ id="path7076"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.31182796"
+ d="M 9.0000000,25.000000 C 9.0000000,26.937500 39.125000,24.062500 39.125000,25.000000 L 39.125000,22.000000 L 9.0000000,22.000000 L 9.0000000,25.000000 z "
+ id="path7914"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
diff --git a/apps/files_pdfviewer/js/pdfview.js b/apps/files_pdfviewer/js/pdfview.js
new file mode 100755
index 00000000000..5e546fd5580
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfview.js
@@ -0,0 +1,737 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+/* FROM PDF.JS, ADAPTED */
+
+'use strict';
+
+var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf';
+var kDefaultScale = 1.25;
+var kDefaultScaleDelta = 1.1;
+var kCacheSize = 20;
+var kCssUnits = 96.0 / 72.0;
+var kScrollbarPadding = 40;
+var kMinScale = 0.25;
+var kMaxScale = 4.0;
+
+
+var Cache = function cacheCache(size) {
+ var data = [];
+ this.push = function cachePush(view) {
+ var i = data.indexOf(view);
+ if (i >= 0)
+ data.splice(i);
+ data.push(view);
+ if (data.length > size)
+ data.shift().update();
+ };
+};
+
+var cache = new Cache(kCacheSize);
+var currentPageNumber = 1;
+
+var PDFView = {
+ pages: [],
+ thumbnails: [],
+ currentScale: kDefaultScale,
+ initialBookmark: document.location.hash.substring(1),
+
+ setScale: function pdfViewSetScale(val, resetAutoSettings) {
+ var pages = this.pages;
+ for (var i = 0; i < pages.length; i++)
+ pages[i].update(val * kCssUnits);
+
+ if (this.currentScale != val)
+ this.pages[this.page - 1].scrollIntoView();
+ this.currentScale = val;
+
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('scalechange', false, false, window, 0);
+ event.scale = val;
+ event.resetAutoSettings = resetAutoSettings;
+ window.dispatchEvent(event);
+ },
+
+ parseScale: function pdfViewParseScale(value, resetAutoSettings) {
+ if ('custom' == value)
+ return;
+
+ var scale = parseFloat(value);
+ if (scale) {
+ this.setScale(scale, true);
+ return;
+ }
+
+ var currentPage = this.pages[this.page - 1];
+ var pageWidthScale = ($("#content").width() - kScrollbarPadding) /
+ currentPage.width / kCssUnits;
+ var pageHeightScale = ($("#content").height() - kScrollbarPadding) /
+ currentPage.height / kCssUnits;
+ if ('page-width' == value)
+ this.setScale(pageWidthScale, resetAutoSettings);
+ if ('page-height' == value)
+ this.setScale(pageHeightScale, resetAutoSettings);
+ if ('page-fit' == value) {
+ this.setScale(
+ Math.min(pageWidthScale, pageHeightScale), resetAutoSettings);
+ }
+ },
+
+ zoomIn: function pdfViewZoomIn() {
+ var newScale = Math.min(kMaxScale, this.currentScale * kDefaultScaleDelta);
+ this.setScale(newScale, true);
+ },
+
+ zoomOut: function pdfViewZoomOut() {
+ var newScale = Math.max(kMinScale, this.currentScale / kDefaultScaleDelta);
+ this.setScale(newScale, true);
+ },
+
+ set page(val) {
+ var pages = this.pages;
+ var input = document.getElementById('pageNumber');
+ if (!(0 < val && val <= pages.length)) {
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('pagechange', false, false, window, 0);
+ event.pageNumber = this.page;
+ window.dispatchEvent(event);
+ return;
+ }
+
+ currentPageNumber = val;
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('pagechange', false, false, window, 0);
+ event.pageNumber = val;
+ window.dispatchEvent(event);
+
+ // checking if the this.page was called from the updateViewarea function:
+ // avoiding the creation of two "set page" method (internal and public)
+ if (updateViewarea.inProgress)
+ return;
+
+ // Avoid scrolling the first page during loading
+ if (this.loading && val == 1)
+ return;
+
+ pages[val - 1].scrollIntoView();
+ },
+
+ get page() {
+ return currentPageNumber;
+ },
+
+ open: function pdfViewOpen(url, scale) {
+ document.title = PDFView.Ptitle;
+ this.url = url;
+ var self = this;
+ PDFJS.getPdf(
+ {
+ url: url,
+ progress: function getPdfProgress(evt) {
+ if (evt.lengthComputable)
+ self.progress(evt.loaded / evt.total);
+ },
+ error: self.error
+ },
+ function getPdfLoad(data) {
+ self.loading = true;
+ self.load(data, scale);
+ self.loading = false;
+ });
+ },
+
+ download: function pdfViewDownload() {
+ window.open(this.url + '#pdfjs.action=download', '_parent');
+ },
+
+ navigateTo: function pdfViewNavigateTo(dest) {
+ if (typeof dest === 'string')
+ dest = this.destinations[dest];
+ if (!(dest instanceof Array))
+ return; // invalid destination
+ // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
+ var destRef = dest[0];
+ var pageNumber = destRef instanceof Object ?
+ this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1);
+ if (pageNumber) {
+ this.page = pageNumber;
+ var currentPage = this.pages[pageNumber - 1];
+ currentPage.scrollIntoView(dest);
+ }
+ },
+
+ getDestinationHash: function pdfViewGetDestinationHash(dest) {
+ if (typeof dest === 'string')
+ return '#' + escape(dest);
+ if (dest instanceof Array) {
+ var destRef = dest[0]; // see navigateTo method for dest format
+ var pageNumber = destRef instanceof Object ?
+ this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
+ (destRef + 1);
+ if (pageNumber) {
+ var pdfOpenParams = '#page=' + pageNumber;
+ if (isName(dest[1], 'XYZ')) {
+ var scale = (dest[4] || this.currentScale);
+ pdfOpenParams += '&zoom=' + (scale * 100);
+ if (dest[2] || dest[3]) {
+ pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
+ }
+ }
+ return pdfOpenParams;
+ }
+ }
+ return '';
+ },
+
+ error: function pdfViewError() {
+ var loadingIndicator = document.getElementById('loading');
+ loadingIndicator.innerHTML = 'Error';
+ },
+
+ progress: function pdfViewProgress(level) {
+ var percent = Math.round(level * 100);
+ var loadingIndicator = document.getElementById('loading');
+ loadingIndicator.innerHTML = 'Loading... ' + percent + '%';
+ },
+
+ load: function pdfViewLoad(data, scale) {
+ var loadingIndicator = document.getElementById('loading');
+ loadingIndicator.setAttribute('hidden', 'true');
+
+ var container = document.getElementById('viewer');
+ while (container.hasChildNodes())
+ container.removeChild(container.lastChild);
+
+ var pdf = new PDFJS.PDFDoc(data);
+ var pagesCount = pdf.numPages;
+ document.getElementById('numPages').innerHTML = pagesCount;
+ document.getElementById('pageNumber').max = pagesCount;
+
+ var pages = this.pages = [];
+ var pagesRefMap = {};
+ var thumbnails = this.thumbnails = [];
+ for (var i = 1; i <= pagesCount; i++) {
+ var page = pdf.getPage(i);
+ pages.push(new PageView(container, page, i, page.width, page.height,
+ page.stats, this.navigateTo.bind(this)));
+ /*thumbnails.push(new ThumbnailView(sidebar, page, i,
+ page.width / page.height));*/
+ var pageRef = page.ref;
+ pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
+ }
+
+ this.setScale(scale || kDefaultScale, true);
+
+ /*this.pagesRefMap = pagesRefMap;
+ this.destinations = pdf.catalog.destinations;
+ if (pdf.catalog.documentOutline) {
+ this.outline = new DocumentOutlineView(pdf.catalog.documentOutline);
+ var outlineSwitchButton = document.getElementById('outlineSwitch');
+ outlineSwitchButton.removeAttribute('disabled');
+ this.switchSidebarView('outline');
+ }*/
+ this.page = 1;
+
+ /*if (this.initialBookmark) {
+ this.setHash(this.initialBookmark);
+ this.initialBookmark = null;
+ }
+ else
+ this.page = 1;*/
+ },
+
+ setHash: function pdfViewSetHash(hash) {
+ if (!hash)
+ return;
+
+ if (hash.indexOf('=') >= 0) {
+ // parsing query string
+ var paramsPairs = hash.split('&');
+ var params = {};
+ for (var i = 0; i < paramsPairs.length; ++i) {
+ var paramPair = paramsPairs[i].split('=');
+ params[paramPair[0]] = paramPair[1];
+ }
+ // borrowing syntax from "Parameters for Opening PDF Files"
+ if ('nameddest' in params) {
+ PDFView.navigateTo(params.nameddest);
+ return;
+ }
+ if ('page' in params) {
+ var pageNumber = (params.page | 0) || 1;
+ this.page = pageNumber;
+ if ('zoom' in params) {
+ var zoomArgs = params.zoom.split(','); // scale,left,top
+ // building destination array
+ var dest = [null, new Name('XYZ'), (zoomArgs[1] | 0),
+ (zoomArgs[2] | 0), (zoomArgs[0] | 0) / 100];
+ var currentPage = this.pages[pageNumber - 1];
+ currentPage.scrollIntoView(dest);
+ } else
+ this.page = params.page; // simple page
+ return;
+ }
+ } else if (/^\d+$/.test(hash)) // page number
+ this.page = hash;
+ else // named destination
+ PDFView.navigateTo(unescape(hash));
+ },
+
+ /*switchSidebarView: function pdfViewSwitchSidebarView(view) {
+ var thumbsScrollView = document.getElementById('sidebarScrollView');
+ var outlineScrollView = document.getElementById('outlineScrollView');
+ var thumbsSwitchButton = document.getElementById('thumbsSwitch');
+ var outlineSwitchButton = document.getElementById('outlineSwitch');
+ switch (view) {
+ case 'thumbs':
+ thumbsScrollView.removeAttribute('hidden');
+ outlineScrollView.setAttribute('hidden', 'true');
+ thumbsSwitchButton.setAttribute('data-selected', true);
+ outlineSwitchButton.removeAttribute('data-selected');
+ break;
+ case 'outline':
+ thumbsScrollView.setAttribute('hidden', 'true');
+ outlineScrollView.removeAttribute('hidden');
+ thumbsSwitchButton.removeAttribute('data-selected');
+ outlineSwitchButton.setAttribute('data-selected', true);
+ break;
+ }
+ },*/
+
+ getVisiblePages: function pdfViewGetVisiblePages() {
+ var pages = this.pages;
+ var kBottomMargin = 10;
+ var visiblePages = [];
+
+ var currentHeight = kBottomMargin;
+ var windowTop = window.pageYOffset;
+ for (var i = 1; i <= pages.length; ++i) {
+ var page = pages[i - 1];
+ var pageHeight = page.height * page.scale + kBottomMargin;
+ if (currentHeight + pageHeight > windowTop)
+ break;
+
+ currentHeight += pageHeight;
+ }
+
+ var windowBottom = window.pageYOffset + window.innerHeight;
+ for (; i <= pages.length && currentHeight < windowBottom; ++i) {
+ var singlePage = pages[i - 1];
+ visiblePages.push({ id: singlePage.id, y: currentHeight,
+ view: singlePage });
+ currentHeight += singlePage.height * singlePage.scale + kBottomMargin;
+ }
+ return visiblePages;
+ }
+};
+
+var PageView = function pageView(container, content, id, pageWidth, pageHeight,
+ stats, navigateTo) {
+ this.id = id;
+ this.content = content;
+
+ var view = this.content.view;
+ this.x = view.x;
+ this.y = view.y;
+ this.width = view.width;
+ this.height = view.height;
+
+ var anchor = document.createElement('a');
+ anchor.name = '' + this.id;
+
+ var div = document.createElement('div');
+ div.id = 'pageContainer' + this.id;
+ div.className = 'page';
+
+ container.appendChild(anchor);
+ container.appendChild(div);
+
+ this.update = function pageViewUpdate(scale) {
+ this.scale = scale || this.scale;
+ div.style.width = (this.width * this.scale) + 'px';
+
+ div.style.height = (this.height * this.scale) + 'px';
+
+ var container = document.getElementById('viewer');
+ container.style.left = (document.getElementById("content").offsetWidth-(this.width))/2 + 'px';
+
+ while (div.hasChildNodes())
+ div.removeChild(div.lastChild);
+ div.removeAttribute('data-loaded');
+ };
+
+ function setupLinks(content, scale) {
+ function bindLink(link, dest) {
+ link.href = PDFView.getDestinationHash(dest);
+ link.onclick = function pageViewSetupLinksOnclick() {
+ if (dest)
+ PDFView.navigateTo(dest);
+ return false;
+ };
+ }
+
+ var links = content.getLinks();
+ for (var i = 0; i < links.length; i++) {
+ var link = document.createElement('a');
+ link.style.left = (Math.floor(links[i].x - view.x) * scale) + 'px';
+ link.style.top = (Math.floor(links[i].y - view.y) * scale) + 'px';
+ link.style.width = Math.ceil(links[i].width * scale) + 'px';
+ link.style.height = Math.ceil(links[i].height * scale) + 'px';
+ link.href = links[i].url || '';
+ if (!links[i].url)
+ bindLink(link, ('dest' in links[i]) ? links[i].dest : null);
+ div.appendChild(link);
+ }
+ }
+
+ this.getPagePoint = function pageViewGetPagePoint(x, y) {
+ var scale = PDFView.currentScale;
+ return this.content.rotatePoint(x / scale, y / scale);
+ };
+
+ this.scrollIntoView = function pageViewScrollIntoView(dest) {
+ if (!dest) {
+ div.scrollIntoView(true);
+ return;
+ }
+
+ var x = 0, y = 0;
+ var width = 0, height = 0, widthScale, heightScale;
+ var scale = 0;
+ switch (dest[1].name) {
+ case 'XYZ':
+ x = dest[2];
+ y = dest[3];
+ scale = dest[4];
+ break;
+ case 'Fit':
+ case 'FitB':
+ scale = 'page-fit';
+ break;
+ case 'FitH':
+ case 'FitBH':
+ y = dest[2];
+ scale = 'page-width';
+ break;
+ case 'FitV':
+ case 'FitBV':
+ x = dest[2];
+ scale = 'page-height';
+ break;
+ case 'FitR':
+ x = dest[2];
+ y = dest[3];
+ width = dest[4] - x;
+ height = dest[5] - y;
+ widthScale = (window.innerWidth - kScrollbarPadding) /
+ width / kCssUnits;
+ heightScale = (window.innerHeight - kScrollbarPadding) /
+ height / kCssUnits;
+ scale = Math.min(widthScale, heightScale);
+ break;
+ default:
+ return;
+ }
+
+ var boundingRect = [
+ this.content.rotatePoint(x, y),
+ this.content.rotatePoint(x + width, y + height)
+ ];
+
+ if (scale && scale !== PDFView.currentScale)
+ PDFView.setScale(scale, true);
+
+ setTimeout(function pageViewScrollIntoViewRelayout() {
+ // letting page to re-layout before scrolling
+ var scale = PDFView.currentScale;
+ var x = Math.min(boundingRect[0].x, boundingRect[1].x);
+ var y = Math.min(boundingRect[0].y, boundingRect[1].y);
+ var width = Math.abs(boundingRect[0].x - boundingRect[1].x);
+ var height = Math.abs(boundingRect[0].y - boundingRect[1].y);
+
+ // using temporary div to scroll it into view
+ var tempDiv = document.createElement('div');
+ tempDiv.style.position = 'absolute';
+ tempDiv.style.left = Math.floor(x * scale) + 'px';
+ tempDiv.style.top = Math.floor(y * scale) + 'px';
+ tempDiv.style.width = Math.ceil(width * scale) + 'px';
+ tempDiv.style.height = Math.ceil(height * scale) + 'px';
+ div.appendChild(tempDiv);
+ tempDiv.scrollIntoView(true);
+ div.removeChild(tempDiv);
+ }, 0);
+ };
+
+ this.draw = function pageviewDraw() {
+ if (div.hasChildNodes()) {
+ this.updateStats();
+ return false;
+ }
+
+ var canvas = document.createElement('canvas');
+ canvas.id = 'page' + this.id;
+ canvas.mozOpaque = true;
+ div.appendChild(canvas);
+
+ var scale = this.scale;
+ canvas.width = pageWidth * scale;
+ canvas.height = pageHeight * scale;
+
+ var ctx = canvas.getContext('2d');
+ ctx.save();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ ctx.restore();
+ ctx.translate(-this.x * scale, -this.y * scale);
+
+ stats.begin = Date.now();
+ this.content.startRendering(ctx, this.updateStats);
+
+ setupLinks(this.content, this.scale);
+ div.setAttribute('data-loaded', true);
+
+ return true;
+ };
+
+ this.updateStats = function pageViewUpdateStats() {
+ var t1 = stats.compile, t2 = stats.fonts, t3 = stats.render;
+ var str = 'Time to compile/fonts/render: ' +
+ (t1 - stats.begin) + '/' + (t2 - t1) + '/' + (t3 - t2) + ' ms';
+ };
+};
+
+var ThumbnailView = function thumbnailView(container, page, id, pageRatio) {
+ var anchor = document.createElement('a');
+ anchor.href = '#' + id;
+ anchor.onclick = function stopNivigation() {
+ PDFView.page = id;
+ return false;
+ };
+
+ var div = document.createElement('div');
+ div.id = 'thumbnailContainer' + id;
+ div.className = 'thumbnail';
+
+ anchor.appendChild(div);
+ container.appendChild(anchor);
+
+ this.draw = function thumbnailViewDraw() {
+ if (div.hasChildNodes())
+ return;
+
+ var canvas = document.createElement('canvas');
+ canvas.id = 'thumbnail' + id;
+ canvas.mozOpaque = true;
+
+ var maxThumbSize = 134;
+ canvas.width = pageRatio >= 1 ? maxThumbSize :
+ maxThumbSize * pageRatio;
+ canvas.height = pageRatio <= 1 ? maxThumbSize :
+ maxThumbSize / pageRatio;
+
+ div.setAttribute('data-loaded', true);
+ div.appendChild(canvas);
+
+ var ctx = canvas.getContext('2d');
+ ctx.save();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ ctx.restore();
+
+ var view = page.view;
+ var scaleX = (canvas.width / page.width);
+ var scaleY = (canvas.height / page.height);
+ ctx.translate(-view.x * scaleX, -view.y * scaleY);
+ div.style.width = (view.width * scaleX) + 'px';
+ div.style.height = (view.height * scaleY) + 'px';
+ div.style.lineHeight = (view.height * scaleY) + 'px';
+
+ page.startRendering(ctx, function thumbnailViewDrawStartRendering() {});
+ };
+};
+
+var DocumentOutlineView = function documentOutlineView(outline) {
+ var outlineView = document.getElementById('outlineView');
+
+ function bindItemLink(domObj, item) {
+ domObj.href = PDFView.getDestinationHash(item.dest);
+ domObj.onclick = function documentOutlineViewOnclick(e) {
+ PDFView.navigateTo(item.dest);
+ return false;
+ };
+ }
+
+ var queue = [{parent: outlineView, items: outline}];
+ while (queue.length > 0) {
+ var levelData = queue.shift();
+ var i, n = levelData.items.length;
+ for (i = 0; i < n; i++) {
+ var item = levelData.items[i];
+ var div = document.createElement('div');
+ div.className = 'outlineItem';
+ var a = document.createElement('a');
+ bindItemLink(a, item);
+ a.textContent = item.title;
+ div.appendChild(a);
+
+ if (item.items.length > 0) {
+ var itemsDiv = document.createElement('div');
+ itemsDiv.className = 'outlineItems';
+ div.appendChild(itemsDiv);
+ queue.push({parent: itemsDiv, items: item.items});
+ }
+
+ levelData.parent.appendChild(div);
+ }
+ }
+};
+
+function webViewerLoad(url) {
+ var scale = kDefaultScale;
+ PDFView.open(url, parseFloat(PDFView.parseScale(scale)));
+
+ if (!window.File || !window.FileReader || !window.FileList || !window.Blob)
+ document.getElementById('fileInput').setAttribute('hidden', 'true');
+ else
+ document.getElementById('fileInput').value = null;
+}
+
+window.addEventListener('unload', function webViewerUnload(evt) {
+ window.scrollTo(0, 0);
+}, true);
+
+function updateViewarea() {
+ var visiblePages = PDFView.getVisiblePages();
+ for (var i = 0; i < visiblePages.length; i++) {
+ var page = visiblePages[i];
+ if (PDFView.pages[page.id - 1].draw())
+ cache.push(page.view);
+ }
+
+ if (!visiblePages.length)
+ return;
+
+ updateViewarea.inProgress = true; // used in "set page"
+ var currentId = PDFView.page;
+ var firstPage = visiblePages[0];
+ PDFView.page = firstPage.id;
+ updateViewarea.inProgress = false;
+
+ var kViewerTopMargin = 52;
+ var pageNumber = firstPage.id;
+ var pdfOpenParams = '#page=' + pageNumber;
+ pdfOpenParams += '&zoom=' + Math.round(PDFView.currentScale * 100);
+ var currentPage = PDFView.pages[pageNumber - 1];
+ var topLeft = currentPage.getPagePoint(window.pageXOffset,
+ window.pageYOffset - firstPage.y - kViewerTopMargin);
+ pdfOpenParams += ',' + Math.round(topLeft.x) + ',' + Math.round(topLeft.y);
+}
+
+window.addEventListener('scroll', function webViewerScroll(evt) {
+ updateViewarea();
+}, true);
+
+window.addEventListener('resize', function webViewerResize(evt) {
+ if (document.getElementById('pageWidthOption').selected ||
+ document.getElementById('pageFitOption').selected)
+ PDFView.parseScale(document.getElementById('scaleSelect').value);
+ updateViewarea();
+});
+
+window.addEventListener('hashchange', function webViewerHashchange(evt) {
+ PDFView.setHash(document.location.hash.substring(1));
+});
+
+window.addEventListener('change', function webViewerChange(evt) {
+ var files = evt.target.files;
+ if (!files || files.length == 0)
+ return;
+
+ // Read the local file into a Uint8Array.
+ var fileReader = new FileReader();
+ fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
+ var data = evt.target.result;
+ var buffer = new ArrayBuffer(data.length);
+ var uint8Array = new Uint8Array(buffer);
+
+ for (var i = 0; i < data.length; i++)
+ uint8Array[i] = data.charCodeAt(i);
+ PDFView.load(uint8Array);
+ };
+
+ // Read as a binary string since "readAsArrayBuffer" is not yet
+ // implemented in Firefox.
+ var file = files[0];
+ fileReader.readAsBinaryString(file);
+
+ document.title = PDFView.Ptitle;
+
+ // URL does not reflect proper document location - hiding some icons.
+ document.getElementById('download').setAttribute('hidden', 'true');
+}, true);
+
+window.addEventListener('scalechange', function scalechange(evt) {
+ var customScaleOption = document.getElementById('customScaleOption');
+ customScaleOption.selected = false;
+
+ if (!evt.resetAutoSettings &&
+ (document.getElementById('pageWidthOption').selected ||
+ document.getElementById('pageFitOption').selected)) {
+ updateViewarea();
+ return;
+ }
+
+ var options = document.getElementById('scaleSelect').options;
+ var predefinedValueFound = false;
+ var value = '' + evt.scale;
+ for (var i = 0; i < options.length; i++) {
+ var option = options[i];
+ if (option.value != value) {
+ option.selected = false;
+ continue;
+ }
+ option.selected = true;
+ predefinedValueFound = true;
+ }
+
+ if (!predefinedValueFound) {
+ customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';
+ customScaleOption.selected = true;
+ }
+
+ updateViewarea();
+}, true);
+
+window.addEventListener('pagechange', function pagechange(evt) {
+ var page = evt.pageNumber;
+ if (document.getElementById('pageNumber').value != page)
+ document.getElementById('pageNumber').value = page;
+ document.getElementById('previous').disabled = (page <= 1);
+ document.getElementById('next').disabled = (page >= PDFView.pages.length);
+}, true);
+
+window.addEventListener('keydown', function keydown(evt) {
+ var curElement = document.activeElement;
+ var controlsElement = document.getElementById('controls2');
+ while (curElement) {
+ if (curElement === controlsElement)
+ return; // ignoring if the 'controls' element is focused
+ curElement = curElement.parentNode;
+ }
+ switch (evt.keyCode) {
+ case 61: // FF/Mac '='
+ case 107: // FF '+' and '='
+ case 187: // Chrome '+'
+ PDFView.zoomIn();
+ break;
+ case 109: // FF '-'
+ case 189: // Chrome '-'
+ PDFView.zoomOut();
+ break;
+ case 48: // '0'
+ PDFView.setScale(kDefaultScale, true);
+ break;
+ }
+});
+
+
diff --git a/apps/files_pdfviewer/js/viewer.js b/apps/files_pdfviewer/js/viewer.js
new file mode 100755
index 00000000000..314a08b27e6
--- /dev/null
+++ b/apps/files_pdfviewer/js/viewer.js
@@ -0,0 +1,46 @@
+function hidePDFviewer() {
+ showPDFviewer.shown = false;
+ $('table').show();
+ $('#controls').html(showPDFviewer.oldcode);
+ $("#viewer").remove();
+ $("#loading").remove()
+ document.title = showPDFviewer.lastTitle;
+}
+
+function showPDFviewer(dir,filename){
+ if(!showPDFviewer.shown){
+ $("#editor").hide();
+ var url = OC.filePath('files','ajax','download.php')+'?files='+encodeURIComponent(filename)+"&dir="+encodeURIComponent(dir);
+ $('table').hide();
+ function im(path) { return OC.filePath('files_pdfviewer','js','pdfjs/web/images/'+path); }
+ showPDFviewer.oldcode = $("#controls").html();
+ $("#controls").empty();
+ $("#controls").html('<button id="previous" onclick="PDFView.page--;" oncontextmenu="return false;"><img src="'+im('go-up.svg')+'" align="top" height="10"/>Previous</button><button id="next" onclick="PDFView.page++;" oncontextmenu="return false;"><img src="'+im('go-down.svg')+'" align="top" height="10"/>Next</button><div class="separator"></div><input style="width:25px;" type="number" id="pageNumber" onchange="PDFView.page = this.value;" value="1" size="4" min="1" /><span>/</span><span id="numPages">--</span><div class="separator"></div><button id="zoomOut" title="Zoom Out" onclick="PDFView.zoomOut();" oncontextmenu="return false;"><img src="'+im('zoom-out.svg')+'" align="top" height="10"/></button><button id="zoomIn" title="Zoom In" onclick="PDFView.zoomIn();" oncontextmenu="return false;"><img src="'+im('zoom-in.svg')+
+ '" align="top" height="10"/></button><div class="separator"></div><select id="scaleSelect" onchange="PDFView.parseScale(this.value);" oncontextmenu="return false;"><option id="customScaleOption" value="custom"></option><option value="0.5">50%</option><option value="0.75">75%</option><option value="1">100%</option><option value="1.25" selected="selected">125%</option><option value="1.5">150%</option><option value="2">200%</option><option id="pageWidthOption" value="page-width">Page Width</option><option id="pageFitOption" value="page-fit">Page Fit</option></select><div class="separator"></div><button id="print" onclick="window.print();" oncontextmenu="return false;"><img src="'+im('document-print.svg')+'" align="top" height="10"/>Print</button><button id="download" title="Download" onclick="PDFView.download();" oncontextmenu="return false;">'+
+ '<img src="'+im('download.svg')+'" align="top" height="10"/>Download</button><button id="close" title="Close viewer" onclick="hidePDFviewer();" oncontextmenu="return false;">x</button><span id="info">--</span></div>');
+ var oldcontent = $("#content").html();
+ $("#content").html(oldcontent+'<div id="loading">Loading... 0%</div><div id="viewer"></div>');
+ showPDFviewer.lastTitle = document.title;
+ PDFView.Ptitle = filename;
+ PDFView.open(url,1.00);
+ $("#pageWidthOption").attr("selected","selected");
+ showPDFviewer.shown = true;
+ }
+}
+showPDFviewer.shown=false;
+showPDFviewer.oldCode='';
+showPDFviewer.lastTitle='';
+
+var extrahtml = '<li id="extra" style="display:none;"><a title="" href="'+OC.webroot+"/apps/files_pdfviewer/lastopened.php"+'" style="background-image:url(/owncloud/apps/files_pdfviewer/css/history.png)">Last opened</a></li>';
+
+$(document).ready(function(){
+ if(location.href.indexOf("files")!=-1) {
+ PDFJS.workerSrc = OC.filePath('files_pdfviewer','js','pdfjs/build/pdf.js');
+ if(typeof FileActions!=='undefined'){
+ FileActions.register('application/pdf','Edit','',function(filename){
+ showPDFviewer($('#dir').val(),filename);
+ });
+ FileActions.setDefault('application/pdf','Edit');
+ }
+ }
+});
diff --git a/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php
index d9df4abe984..51fda6aed40 100644
--- a/apps/files_sharing/ajax/getitem.php
+++ b/apps/files_sharing/ajax/getitem.php
@@ -19,6 +19,7 @@ $source = dirname($source);
while ($source != "" && $source != "/" && $source != "." && $source != $userDirectory) {
if ($values = OC_Share::getMySharedItem($source)) {
$values = array_values($values);
+ $users = array();
$parentUsers = array();
for ($i = 0; $i < count($values); $i++) {
if ($values[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) {
diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php
index f7849d499f0..529a82b830a 100644
--- a/apps/files_sharing/sharedstorage.php
+++ b/apps/files_sharing/sharedstorage.php
@@ -79,20 +79,16 @@ class OC_Filestorage_Shared extends OC_Filestorage {
if ($path == "" || $path == "/") {
$path = $this->datadir.$path;
$sharedItems = OC_Share::getItemsInFolder($path);
- if (empty($sharedItems)) {
- return false;
- } else {
- global $FAKEDIRS;
- $files = array();
- foreach ($sharedItems as $item) {
- // If item is in the root of the shared storage provider and the item exists add it to the fakedirs
- if (dirname($item['target'])."/" == $path && $this->file_exists(basename($item['target']))) {
- $files[] = basename($item['target']);
- }
+ global $FAKEDIRS;
+ $files = array();
+ foreach ($sharedItems as $item) {
+ // If item is in the root of the shared storage provider and the item exists add it to the fakedirs
+ if (dirname($item['target'])."/" == $path && $this->file_exists(basename($item['target']))) {
+ $files[] = basename($item['target']);
}
- $FAKEDIRS['shared'] = $files;
- return opendir('fakedir://shared');
}
+ $FAKEDIRS['shared'] = $files;
+ return opendir('fakedir://shared');
} else {
$source = $this->getSource($path);
if ($source) {
@@ -264,7 +260,9 @@ class OC_Filestorage_Shared extends OC_Filestorage {
}
public function is_writeable($path) {
- if ($path == "" || $path == "/" || OC_Share::getPermissions($this->datadir.$path) & OC_Share::WRITE) {
+ if($path == "" || $path == "/"){
+ return false;
+ }elseif (OC_Share::getPermissions($this->datadir.$path) & OC_Share::WRITE) {
return true;
} else {
return false;
diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php
new file mode 100644
index 00000000000..8a006dda637
--- /dev/null
+++ b/apps/gallery/ajax/galleryOp.php
@@ -0,0 +1,29 @@
+<?
+require_once('../../../lib/base.php');
+require_once(OC::$CLASSPATH['OC_Gallery_Album']);
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
+
+function handleRename($oldname, $newname) {
+ OC_Gallery_Album::rename($oldname, $newname, OC_User::getUser());
+}
+
+function handleRemove($name) {
+ OC_Gallery_Album::remove(OC_User::getUser(), $name);
+}
+
+if ($_GET['operation']) {
+ switch($_GET['operation']) {
+ case "rename":
+ handleRename($_GET['oldname'], $_GET['newname']);
+ OC_JSON::success(array('newname' => $_GET['newname']));
+ break;
+ case "remove":
+ handleRemove($_GET['name']);
+ OC_JSON::success();
+ break;
+ default:
+ OC_JSON::error(array('cause' => "Unknown operation"));
+ }
+}
+?>
diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php
index 856f29344d7..e4736076fed 100644
--- a/apps/gallery/ajax/getAlbums.php
+++ b/apps/gallery/ajax/getAlbums.php
@@ -4,12 +4,14 @@ OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('gallery');
$a = array();
+
$result = OC_Gallery_Album::find(OC_User::getUser());
while ($r = $result->fetchRow()) {
$album_name = $r['album_name'];
$tmp_res = OC_Gallery_Photo::find($r['album_id']);
- $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10));
+
+ $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10), 'bgPath' => OC::$WEBROOT.'/data/'.OC_User::getUser().'/gallery/'.$album_name.'.png');
}
OC_JSON::success(array('albums'=>$a));
diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php
index ff696804b00..b1f0a433a42 100644
--- a/apps/gallery/ajax/scanForAlbums.php
+++ b/apps/gallery/ajax/scanForAlbums.php
@@ -4,7 +4,7 @@ require_once('../../../lib/base.php');
OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('gallery');
-OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan('')));
-//OC_JSON::success(array('albums' => array(array('name' => 'test', 'imagesCount' => 1, 'images' => array('dupa')))));
+OC_Gallery_Scanner::cleanUp();
+OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan('/')));
?>
diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php
index 2b1ab857afc..3a2dbcb43ad 100644
--- a/apps/gallery/appinfo/app.php
+++ b/apps/gallery/appinfo/app.php
@@ -2,6 +2,7 @@
OC::$CLASSPATH['OC_Gallery_Album'] = 'apps/gallery/lib/album.php';
OC::$CLASSPATH['OC_Gallery_Photo'] = 'apps/gallery/lib/photo.php';
OC::$CLASSPATH['OC_Gallery_Scanner'] = 'apps/gallery/lib/scanner.php';
+OC::$CLASSPATH['OC_Gallery_Hooks_Handlers'] = 'apps/gallery/lib/hooks_handlers.php';
OC_App::register(array(
'order' => 20,
@@ -28,4 +29,6 @@ OC_App::addNavigationEntry( array(
}
new OC_GallerySearchProvider();
+
+require_once('apps/gallery/lib/hooks_handlers.php');
?>
diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml
index fd55b3a6fb4..db88e4c1b5a 100644
--- a/apps/gallery/appinfo/database.xml
+++ b/apps/gallery/appinfo/database.xml
@@ -27,6 +27,12 @@
<notnull>true</notnull>
<length>100</length>
</field>
+ <field>
+ <name>album_path</name>
+ <type>text</type>
+ <notnull>true</notnull>
+ <length>100</length>
+ </field>
</declaration>
</table>
<table>
diff --git a/apps/gallery/appinfo/info.xml b/apps/gallery/appinfo/info.xml
index 054ddb6f139..ba51bf0bd55 100644
--- a/apps/gallery/appinfo/info.xml
+++ b/apps/gallery/appinfo/info.xml
@@ -2,9 +2,10 @@
<info>
<id>gallery</id>
<name>Gallery</name>
- <version>0.1</version>
+ <version>0.2</version>
<licence>AGPL</licence>
- <author>Bartosz Przybylski</author>
+ <author>Bartek Przybylski</author>
<require>2</require>
<description></description>
-</info> \ No newline at end of file
+ <default_enable/>
+</info>
diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css
index e23d822fec7..cc343ba0d08 100644
--- a/apps/gallery/css/styles.css
+++ b/apps/gallery/css/styles.css
@@ -1,35 +1,11 @@
-div#gallery_list {
- margin: 90pt 20pt;
-}
-div#gallery_list.leftcontent {
- padding-top: 15px;
- margin: 0;
- text-align: center;
-}
+div#gallery_list { margin: 90pt 20pt; }
+div#gallery_list.leftcontent { padding-top: 15px; margin: 0; text-align: center; }
+div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; border: solid 1px black; position: relative; overflow: hidden; color: #999; }
+div#gallery_album_box:hover { color: black; }
+.leftcontent div#gallery_album_box { margin: 5px; }
+div#gallery_album_box h1 { font-size: 12pt; font-family: Verdana; }
+div#gallery_album_cover { width: 199px; height: 199px; border: solid 1pt #999; padding: 0; }
+div#gallery_control_overlay { border: 0; position:absolute; right: 10pt; background-color: #333; opacity: 0.5; visibility:hidden; padding: 0 5pt; }
+div#gallery_control_overlay a { color:white; }
+#gallery_images { padding:10px 5px; }
-div#gallery_album_box {
- width: 200px;
- text-align: center;
- border: 0;
- display: inline-block;
- margin: 5pt;
- vertical-align: top;
-}
-.leftcontent div#gallery_album_box {
- margin: 5px;
-}
-
-div#gallery_album_box h1 {
- font-size: 12pt;
- font-family: Arial;
-}
-
-div#gallery_album_cover {
- width: 199px;
- height: 199px;
- border: solid 1px black;
-}
-
-#gallery_images {
-padding:10px 5px;
-}
diff --git a/apps/gallery/index.php b/apps/gallery/index.php
index 2c409089ebe..0cd795bac01 100644
--- a/apps/gallery/index.php
+++ b/apps/gallery/index.php
@@ -5,6 +5,12 @@ OC_Util::checkLoggedIn();
OC_Util::checkAppEnabled('gallery');
OC_App::setActiveNavigationEntry( 'gallery_index' );
+if (!file_exists(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery')) {
+ mkdir(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery');
+ $f = fopen(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery/.htaccess', 'w');
+ fwrite($f, "allow from all");
+ fclose($f);
+}
if (!isset($_GET['view'])) {
$result = OC_Gallery_Album::find(OC_User::getUser());
diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js
index 776feae32cc..f6cb2da3103 100644
--- a/apps/gallery/js/album_cover.js
+++ b/apps/gallery/js/album_cover.js
@@ -4,7 +4,7 @@ $(document).ready(function() {
if (r.status == 'success') {
for (var i in r.albums) {
var a = r.albums[i];
- Albums.add(a.name, a.numOfItems);
+ Albums.add(a.name, a.numOfItems, a.bgPath);
}
var targetDiv = document.getElementById('gallery_list');
if (targetDiv) {
@@ -31,7 +31,11 @@ function createNewAlbum() {
}
function scanForAlbums() {
+ $("#notification").fadeIn();
+ $("#notification").slideDown();
$.getJSON('ajax/scanForAlbums.php', function(r) {
+ $("#notification").fadeOut();
+ $("#notification").slideUp();
if (r.status == 'success') {
window.location.reload(true);
} else {
@@ -39,3 +43,37 @@ function scanForAlbums() {
}
});
}
+
+function galleryRemove(albumName) {
+ if (confirm("Do you wan't to remove album " + albumName + "?")) {
+ $.getJSON("ajax/galleryOp.php", {operation: "remove", name: albumName}, function(r) {
+ if (r.status == "success") {
+ $("#gallery_album_box[title='"+albumName+"']").remove();
+ Albums.remove(albumName);
+ } else {
+ alert("Error: " + r.cause);
+ }
+ });
+ }
+}
+
+function galleryRename(name) {
+ var result = window.prompt("Input new gallery name", "");
+ if (result) {
+ if (Albums.find(result)) {
+ alert("Album named '" + result + "' already exists");
+ return;
+ }
+ $.getJSON("ajax/galleryOp.php", {operation: "rename", oldname: name, newname: result}, function(r) {
+ if (r.status == "success") {
+ Albums.rename($("#gallery_album_box[title='"+name+"']"), result);
+ } else {
+ alert("Error: " + r.cause);
+ }
+ });
+
+ } else {
+ alert("Album name can't be empty")
+ }
+}
+
diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js
index 7ab243ededf..ae7d1fac500 100644
--- a/apps/gallery/js/albums.js
+++ b/apps/gallery/js/albums.js
@@ -12,13 +12,13 @@ Albums={
// album with the same name wont be insered,
// and false will be returned
// true on success
- add: function(album_name, num) {
+ add: function(album_name, num, bgPath) {
for (var a in Albums.albums) {
if (a.name == album_name) {
return false;
}
}
- Albums.albums.push({name: album_name, numOfCovers: num});
+ Albums.albums.push({name: album_name, numOfCovers: num, backgroundPath: bgPath});
return true;
},
// remove element with given name
@@ -57,24 +57,38 @@ Albums={
// displays gallery in linear representation
// on given element, and apply default styles for gallery
display: function(element) {
- var displayTemplate = '<div id="gallery_album_box" title="*NAME*"><a href="?view=*NAME*"><div id="gallery_album_cover"></div></a><h1>*NAME*</h1></div></div>';
+ var displayTemplate = '<div id="gallery_album_box" title="*NAME*"><div id="gallery_control_overlay"><a href="#" onclick="galleryRename(\'*NAME*\');return false;">rename</a> | <a href="#" onclick="galleryRemove(\'*NAME*\');">remove</a></div><a href="?view=*NAME*"><div id="gallery_album_cover" title="*NAME*"></div></a><h1>*NAME*</h1></div></div>';
for (var i in Albums.albums) {
var a = Albums.albums[i];
var local = $(displayTemplate.replace(/\*NAME\*/g, a.name));
- local.css('background-repeat', 'no-repeat');
- local.css('background-position', '0 0');
- local.css('background-image','url("ajax/getCovers.php?album_name='+a.name+'")');
- local.mousemove(function(e) {
+ $("#gallery_album_cover", local).css('background-repeat', 'no-repeat');
+ $("#gallery_album_cover", local).css('background-position', '0');
+ $("#gallery_album_cover", local).css('background-image','url("ajax/getCovers.php?album_name='+a.name+'")');
+ local.mouseover(function(e) {
+ $("#gallery_control_overlay", this).css('visibility','visible');
+ });
+ local.mouseout(function(e) {
+ $("#gallery_control_overlay", this).css('visibility','hidden');
+ });
+ $("#gallery_album_cover", local).mousemove(function(e) {
+
var albumMetadata = Albums.find(this.title);
if (albumMetadata == undefined) {
return;
}
- var x = Math.min(Math.floor((e.clientX - this.offsetLeft)/(this.offsetWidth/albumMetadata.numOfCovers)), albumMetadata.numOfCovers-1);
- x *= this.offsetWidth;
+ var x = Math.min(Math.floor((e.layerX - this.offsetLeft)/(this.offsetWidth/albumMetadata.numOfCovers)), albumMetadata.numOfCovers-1);
+ x *= this.offsetWidth-1;
$(this).css('background-position', -x+'px 0');
});
$(element).append(local);
}
+ },
+ rename: function(element, new_name) {
+ if (new_name) {
+ $(element).attr("title", new_name);
+ $("a", element).attr("href", "?view="+new_name);
+ $("h1", element).text(new_name);
+ }
}
}
diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php
index 6ddfe46de3d..98876b891c5 100644
--- a/apps/gallery/lib/album.php
+++ b/apps/gallery/lib/album.php
@@ -1,12 +1,18 @@
<?php
-class OC_Gallery_Album{
- public static function create($owner, $name){
- $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (uid_owner, album_name) VALUES (?, ?)');
- $stmt->execute(array($owner, $name));
+class OC_Gallery_Album {
+ public static function create($owner, $name, $path){
+ $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (uid_owner, album_name, album_path) VALUES (?, ?, ?)');
+ $stmt->execute(array($owner, $name, $path));
}
- public static function find($owner, $name=null){
- $sql = 'SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?';
+
+ public static function rename($oldname, $newname, $owner) {
+ $stmt = OC_DB::prepare('UPDATE OR IGNORE *PREFIX*gallery_albums SET album_name=? WHERE uid_owner=? AND album_name=?');
+ $stmt->execute(array($newname, $owner, $oldname));
+ }
+
+ public static function remove($owner, $name=null) {
+ $sql = 'DELETE FROM *PREFIX*gallery_albums WHERE uid_owner = ?';
$args = array($owner);
if (!is_null($name)){
$sql .= ' AND album_name = ?';
@@ -15,4 +21,22 @@ class OC_Gallery_Album{
$stmt = OC_DB::prepare($sql);
return $stmt->execute($args);
}
+
+ public static function find($owner, $name=null, $path=null){
+ $sql = 'SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?';
+ $args = array($owner);
+ if (!is_null($name)){
+ $sql .= ' AND album_name = ?';
+ $args[] = $name;
+ }
+ if (!is_null($path)){
+ $sql .= ' AND album_path = ?';
+ $args[] = $path;
+ }
+ $stmt = OC_DB::prepare($sql);
+ return $stmt->execute($args);
+ }
+
}
+
+?>
diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php
new file mode 100644
index 00000000000..1bddaf363e3
--- /dev/null
+++ b/apps/gallery/lib/hooks_handlers.php
@@ -0,0 +1,91 @@
+<?php
+
+OC_Hook::connect("OC_Filesystem", "post_write", "OC_Gallery_Hooks_Handlers", "addPhotoFromPath");
+OC_Hook::connect("OC_Filesystem", "delete", "OC_Gallery_Hooks_Handlers", "removePhoto");
+OC_Hook::connect("OC_Filesystem", "post_rename", "OC_Gallery_Hooks_Handlers", "renamePhoto");
+
+require_once(OC::$CLASSPATH['OC_Gallery_Album']);
+require_once(OC::$CLASSPATH['OC_Gallery_Photo']);
+
+class OC_Gallery_Hooks_Handlers {
+ private static $APP_TAG = "Gallery";
+
+ private static function isPhoto($filename) {
+ if (substr(OC_Filesystem::getMimeType($filename), 0, 6) == "image/")
+ return 1;
+ return 0;
+ }
+
+ private static function createAlbum($path) {
+ $new_album_name = trim(str_replace('/', '.', $path), '.');
+ if ($new_album_name == '') $new_album_name = 'main';
+
+ OC_Log::write(self::$APP_TAG, 'Creating new album '.$new_album_name, OC_Log::DEBUG);
+ OC_Gallery_Album::create(OC_User::getUser(), $new_album_name, $path);
+
+ return OC_Gallery_Album::find(OC_User::getUser(), null, $path);
+ }
+
+ public static function addPhotoFromPath($params) {
+ if (!self::isPhoto($params['path'])) return;
+ $fullpath = $params['path'];
+ OC_Log::write(self::$APP_TAG, 'Adding file with path '. $fullpath, OC_Log::DEBUG);
+ $path = substr($fullpath, 0, strrpos($fullpath, '/'));
+ $album = OC_Gallery_Album::find(OC_User::getUser(), null, $path);
+
+ if ($album->numRows() == 0) {
+ $album = self::createAlbum($path);
+ }
+ $album = $album->fetchRow();
+ $albumId = $album['album_id'];
+ $photo = OC_Gallery_Photo::find($albumId, $fullpath);
+ if ($photo->numRows() == 0) { // don't duplicate photo entries
+ OC_Log::write(self::$APP_TAG, 'Adding new photo to album', OC_Log::DEBUG);
+ OC_Gallery_Photo::create($albumId, $fullpath);
+ }
+
+ }
+
+ public static function removePhoto($params) {
+ $path = $params['path'];
+ if (!self::isPhoto($path)) return;
+ OC_Gallery_Photo::removeByPath($path);
+ }
+
+ public static function renamePhoto($params) {
+ $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/'));
+ $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/'));
+ if (!self::isPhoto($params['newpath'])) return;
+ $album;
+ $newAlbumId;
+ $oldAlbumId;
+ if ($olddir == $newdir) {
+ // album changing is not needed
+ $album = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir);
+ if ($album->numRows() == 0) {
+ $album = self::createAlbum($newdir);
+ }
+ $album = $album->fetchRow();
+ $newAlbumId = $oldAlbumId = $album['album_id'];
+ } else {
+ $newalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $newdir);
+ $oldalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir);
+
+ if ($newalbum->numRows() == 0) {
+ $newalbum = self::createAlbum($newdir);
+ }
+ $newalbum = $newalbum->fetchRow();
+ if ($oldalbum->numRows() == 0) {
+ OC_Gallery_Photo::create($newalbum['album_id'], $params['newpath']);
+ return;
+ }
+ $oldalbum = $oldalbum->fetchRow();
+ $newAlbumId = $newalbum['album_id'];
+ $oldAlbumId = $oldalbum['album_id'];
+
+ }
+ OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $params['oldpath'], $params['newpath']);
+ }
+}
+
+?>
diff --git a/apps/gallery/lib/images_utils.php b/apps/gallery/lib/images_utils.php
new file mode 100644
index 00000000000..cb46bf3f160
--- /dev/null
+++ b/apps/gallery/lib/images_utils.php
@@ -0,0 +1,43 @@
+<?php
+require_once('../../../lib/base.php');
+OC_JSON::checkLoggedIn();
+OC_JSON::checkAppEnabled('gallery');
+
+function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height, $tgtImg, $shift) {
+ //getting the image dimensions
+ list($width_orig, $height_orig) = getimagesize($imgSrc);
+ switch (strtolower(substr($imgSrc, strrpos($imgSrc, '.')+1))) {
+ case "jpeg":
+ case "jpg":
+ case "tiff":
+ $myImage = imagecreatefromjpeg($imgSrc);
+ break;
+ case "png":
+ $myImage = imagecreatefrompng($imgSrc);
+ break;
+ default:
+ exit();
+ }
+ $ratio_orig = $width_orig/$height_orig;
+
+ if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
+ $new_height = $thumbnail_width/$ratio_orig;
+ $new_width = $thumbnail_width;
+ } else {
+ $new_width = $thumbnail_height*$ratio_orig;
+ $new_height = $thumbnail_height;
+ }
+
+ $x_mid = $new_width/2; //horizontal middle
+ $y_mid = $new_height/2; //vertical middle
+
+ $process = imagecreatetruecolor(round($new_width), round($new_height));
+
+ imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
+ imagecopyresampled($tgtImg, $process, $shift, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);
+
+ imagedestroy($process);
+ imagedestroy($myImage);
+}
+
+?>
diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php
index 97d159935f5..f8a640819a1 100644
--- a/apps/gallery/lib/photo.php
+++ b/apps/gallery/lib/photo.php
@@ -8,7 +8,6 @@ class OC_Gallery_Photo{
public static function find($albumId, $img=null){
$sql = 'SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ?';
$args = array($albumId);
- $args = array($albumId);
if (!is_null($img)){
$sql .= ' AND file_path = ?';
$args[] = $img;
@@ -25,4 +24,20 @@ class OC_Gallery_Photo{
.' AND photos.album_id = albums.album_id');
return $stmt->execute(array($owner, $album_name));
}
+
+ public static function removeByPath($path) {
+ $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE file_path = ?');
+ $stmt->execute(array($path));
+ }
+
+ public static function removeById($id) {
+ $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE photo_id = ?');
+ $stmt->execute(array($id));
+ }
+
+ public static function changePath($oldAlbumId, $newAlbumId, $oldpath, $newpath) {
+ $stmt = OC_DB::prepare("UPDATE *PREFIX*gallery_photos SET file_path = ?, album_id = ? WHERE album_id = ? and file_path = ?");
+ $stmt->execute(array($newpath, $newAlbumId, $oldAlbumId, $oldpath));
+ }
}
+
diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php
index 1590051c48d..f754f913001 100644
--- a/apps/gallery/lib/scanner.php
+++ b/apps/gallery/lib/scanner.php
@@ -1,20 +1,33 @@
<?php
+require_once('base.php'); // base lib
+require_once('images_utils.php');
+
class OC_Gallery_Scanner {
+
public static function scan($root) {
$albums = array();
self::scanDir($root, $albums);
return $albums;
}
+ public static function cleanUp() {
+ $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_albums');
+ $stmt->execute(array());
+ $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos');
+ $stmt->execute(array());
+ }
+
public static function scanDir($path, &$albums) {
$current_album = array('name'=> $path, 'imagesCount' => 0, 'images' => array());
$current_album['name'] = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $current_album['name']));
- $current_album['name'] = ($current_album['name']==='')?'main':$current_album['name'];
+ $current_album['name'] = ($current_album['name']==='.') ?
+ 'main' :
+ trim($current_album['name'],'.');
if ($dh = OC_Filesystem::opendir($path)) {
while (($filename = readdir($dh)) !== false) {
- $filepath = $path.'/'.$filename;
+ $filepath = ($path[strlen($path)-1]=='/'?$path:$path.'/').$filename;
if (substr($filename, 0, 1) == '.') continue;
if (OC_Filesystem::is_dir($filepath)) {
self::scanDir($filepath, $albums);
@@ -25,9 +38,10 @@ class OC_Gallery_Scanner {
}
$current_album['imagesCount'] = count($current_album['images']);
$albums[] = $current_album;
+
$result = OC_Gallery_Album::find(OC_User::getUser(), $current_album['name']);
if ($result->numRows() == 0 && count($current_album['images'])) {
- OC_Gallery_Album::create(OC_User::getUser(), $current_album['name']);
+ OC_Gallery_Album::create(OC_User::getUser(), $current_album['name'], $path);
$result = OC_Gallery_Album::find(OC_User::getUser(), $current_album['name']);
}
$albumId = $result->fetchRow();
@@ -38,6 +52,18 @@ class OC_Gallery_Scanner {
OC_Gallery_Photo::create($albumId, $img);
}
}
+ if (count($current_album['images'])) {
+ self::createThumbnail($current_album['name'],$current_album['images']);
+ }
+ }
+
+ public static function createThumbnail($albumName, $files) {
+ $file_count = min(count($files), 10);
+ $thumbnail = imagecreatetruecolor($file_count*200, 200);
+ for ($i = 0; $i < $file_count; $i++) {
+ CroppedThumbnail(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/files/'.$files[$i], 200, 200, $thumbnail, $i*200);
+ }
+ imagepng($thumbnail, OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery/' . $albumName.'.png');
}
public static function isPhoto($filename) {
diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php
index 0e89e448768..7c6e91a468e 100644
--- a/apps/gallery/templates/index.php
+++ b/apps/gallery/templates/index.php
@@ -4,9 +4,10 @@ OC_Util::addScript('gallery', 'albums');
OC_Util::addScript('gallery', 'album_cover');
?>
+<div id="notification"><div id="gallery_notification_text">Creating thumbnails</div></div>
<div id="controls">
- <!-- <input type="button" value="New album" onclick="javascript:createNewAlbum();" />-->
- <input type="button" value="Rescan" onclick="javascript:scanForAlbums();" /><br/>
+ <input type="button" value="Rescan" onclick="javascript:scanForAlbums();" />
+ <br/>
</div>
<div id="gallery_list">
</div>
diff --git a/apps/gallery/templates/view_album.php b/apps/gallery/templates/view_album.php
index ae43e2fc557..4acc965269c 100644
--- a/apps/gallery/templates/view_album.php
+++ b/apps/gallery/templates/view_album.php
@@ -15,7 +15,8 @@ OC_Util::addStyle( 'files_imageviewer', 'jquery.fancybox-1.3.4' );
</script>
<div id="controls">
- <a href="?"><input type="button" value="Back" /></a><br/>
+ <a href="?"><input type="button" value="Back" /></a>
+<br/>
</div>
<div id="gallery_list" class="leftcontent">
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.as b/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.as
new file mode 100644
index 00000000000..1178dacc345
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.as
@@ -0,0 +1,415 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Version: 2.1.0
+ * Date: 1st September 2011
+ *
+ * FlashVars expected: (AS3 property of: loaderInfo.parameters)
+ * id: (URL Encoded: String) Id of jPlayer instance
+ * vol: (Number) Sets the initial volume
+ * muted: (Boolean in a String) Sets the initial muted state
+ * jQuery: (URL Encoded: String) Sets the jQuery var name. Used with: someVar = jQuery.noConflict(true);
+ *
+ * Compiled using: Adobe Flex Compiler (mxmlc) Version 4.5.1 build 21328
+ */
+
+package {
+ import flash.system.Security;
+ import flash.external.ExternalInterface;
+
+ import flash.utils.Timer;
+ import flash.events.TimerEvent;
+
+ import flash.text.TextField;
+ import flash.text.TextFormat;
+
+ import flash.events.KeyboardEvent;
+
+ import flash.display.Sprite;
+ import happyworm.jPlayer.*;
+
+ import flash.display.StageAlign;
+ import flash.display.StageScaleMode;
+ import flash.events.Event;
+ import flash.events.MouseEvent;
+
+ import flash.ui.ContextMenu;
+ import flash.ui.ContextMenuItem;
+ import flash.events.ContextMenuEvent;
+ import flash.net.URLRequest;
+ import flash.net.navigateToURL;
+
+ public class Jplayer extends Sprite {
+ private var jQuery:String;
+ private var sentNumberFractionDigits:uint = 2;
+
+ public var commonStatus:JplayerStatus = new JplayerStatus(); // Used for inital ready event so volume is correct.
+
+ private var myInitTimer:Timer = new Timer(100, 0);
+
+ private var myMp3Player:JplayerMp3;
+ private var myMp4Player:JplayerMp4;
+
+ private var isMp3:Boolean = false;
+ private var isVideo:Boolean = false;
+
+ private var txLog:TextField;
+ private var debug:Boolean = false; // Set debug to false for release compile!
+
+ public function Jplayer() {
+ flash.system.Security.allowDomain("*");
+
+ jQuery = loaderInfo.parameters.jQuery + "('#" + loaderInfo.parameters.id + "').jPlayer";
+ commonStatus.volume = Number(loaderInfo.parameters.vol);
+ commonStatus.muted = loaderInfo.parameters.muted == "true";
+
+ stage.scaleMode = StageScaleMode.NO_SCALE;
+ stage.align = StageAlign.TOP_LEFT;
+ stage.addEventListener(Event.RESIZE, resizeHandler);
+ stage.addEventListener(MouseEvent.CLICK, clickHandler);
+
+ var initialVolume:Number = commonStatus.volume;
+ if(commonStatus.muted) {
+ initialVolume = 0;
+ }
+ myMp3Player = new JplayerMp3(initialVolume);
+ addChild(myMp3Player);
+
+ myMp4Player = new JplayerMp4(initialVolume);
+ addChild(myMp4Player);
+
+ setupListeners(!isMp3, isMp3); // Set up the listeners to the default isMp3 state.
+
+ // The ContextMenu only partially works. The menu select events never occur.
+ // Investigated and it is something to do with the way jPlayer inserts the Flash on the page.
+ // A simple test inserting the Jplayer.swf on a page using: 1) SWFObject 2.2 works. 2) AC_FL_RunContent() works.
+ // jPlayer Flash insertion is based on SWFObject 2.2 and the resaon behind this failure is not clear. The Flash insertion HTML on the page looks similar.
+ var myContextMenu:ContextMenu = new ContextMenu();
+ myContextMenu.hideBuiltInItems();
+ var menuItem_jPlayer:ContextMenuItem = new ContextMenuItem("jPlayer " + JplayerStatus.VERSION);
+ var menuItem_happyworm:ContextMenuItem = new ContextMenuItem("© 2009-2011 Happyworm Ltd", true);
+ menuItem_jPlayer.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_jPlayer);
+ menuItem_happyworm.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_happyworm);
+ myContextMenu.customItems.push(menuItem_jPlayer, menuItem_happyworm);
+ contextMenu = myContextMenu;
+
+ // Log console for dev compile option: debug
+ if(debug) {
+ txLog = new TextField();
+ txLog.x = 5;
+ txLog.y = 5;
+ txLog.width = 540;
+ txLog.height = 390;
+ txLog.border = true;
+ txLog.background = true;
+ txLog.backgroundColor = 0xEEEEFF;
+ txLog.multiline = true;
+ txLog.text = "jPlayer " + JplayerStatus.VERSION;
+ txLog.visible = false;
+ this.addChild(txLog);
+ this.stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler);
+
+ myMp3Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler);
+ myMp4Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler);
+ }
+
+ // Delay init() because Firefox 3.5.7+ developed a bug with local testing in Firebug.
+ myInitTimer.addEventListener(TimerEvent.TIMER, init);
+ myInitTimer.start();
+ }
+
+ private function init(e:TimerEvent):void {
+ myInitTimer.stop();
+ if(ExternalInterface.available) {
+ ExternalInterface.addCallback("fl_setAudio_mp3", fl_setAudio_mp3);
+ ExternalInterface.addCallback("fl_setAudio_m4a", fl_setAudio_m4a);
+ ExternalInterface.addCallback("fl_setVideo_m4v", fl_setVideo_m4v);
+ ExternalInterface.addCallback("fl_clearMedia", fl_clearMedia);
+ ExternalInterface.addCallback("fl_load", fl_load);
+ ExternalInterface.addCallback("fl_play", fl_play);
+ ExternalInterface.addCallback("fl_pause", fl_pause);
+ ExternalInterface.addCallback("fl_play_head", fl_play_head);
+ ExternalInterface.addCallback("fl_volume", fl_volume);
+ ExternalInterface.addCallback("fl_mute", fl_mute);
+
+ ExternalInterface.call(jQuery, "jPlayerFlashEvent", JplayerEvent.JPLAYER_READY, extractStatusData(commonStatus)); // See JplayerStatus() class for version number.
+ }
+ }
+ private function setupListeners(oldMP3:Boolean, newMP3:Boolean):void {
+ if(oldMP3 != newMP3) {
+ if(newMP3) {
+ listenToMp3(true);
+ listenToMp4(false);
+ } else {
+ listenToMp3(false);
+ listenToMp4(true);
+ }
+ }
+ }
+ private function listenToMp3(active:Boolean):void {
+ if(active) {
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
+
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
+
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
+ myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
+ } else {
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
+
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
+
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
+ myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
+ }
+ }
+ private function listenToMp4(active:Boolean):void {
+ if(active) {
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
+
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
+
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
+
+ myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler
+ } else {
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
+
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
+
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
+
+ myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler
+ }
+ }
+ private function fl_setAudio_mp3(src:String):Boolean {
+ if (src != null) {
+ log("fl_setAudio_mp3: "+src);
+ setupListeners(isMp3, true);
+ isMp3 = true;
+ isVideo = false;
+ myMp4Player.clearFile();
+ myMp3Player.setFile(src);
+ return true;
+ } else {
+ log("fl_setAudio_mp3: null");
+ return false;
+ }
+ }
+ private function fl_setAudio_m4a(src:String):Boolean {
+ if (src != null) {
+ log("fl_setAudio_m4a: "+src);
+ setupListeners(isMp3, false);
+ isMp3 = false;
+ isVideo = false;
+ myMp3Player.clearFile();
+ myMp4Player.setFile(src);
+ return true;
+ } else {
+ log("fl_setAudio_m4a: null");
+ return false;
+ }
+ }
+ private function fl_setVideo_m4v(src:String):Boolean {
+ if (src != null) {
+ log("fl_setVideo_m4v: "+src);
+ setupListeners(isMp3, false);
+ isMp3 = false;
+ isVideo = true;
+ myMp3Player.clearFile();
+ myMp4Player.setFile(src);
+ return true;
+ } else {
+ log("fl_setVideo_m4v: null");
+ return false;
+ }
+ }
+ private function fl_clearMedia():void {
+ log("clearMedia.");
+ myMp3Player.clearFile();
+ myMp4Player.clearFile();
+ }
+ private function fl_load():Boolean {
+ log("load.");
+ if(isMp3) {
+ return myMp3Player.load();
+ } else {
+ return myMp4Player.load();
+ }
+ }
+ private function fl_play(time:Number = NaN):Boolean {
+ log("play: time = " + time);
+ if(isMp3) {
+ return myMp3Player.play(time * 1000); // Flash uses milliseconds
+ } else {
+ return myMp4Player.play(time * 1000); // Flash uses milliseconds
+ }
+ }
+ private function fl_pause(time:Number = NaN):Boolean {
+ log("pause: time = " + time);
+ if(isMp3) {
+ return myMp3Player.pause(time * 1000); // Flash uses milliseconds
+ } else {
+ return myMp4Player.pause(time * 1000); // Flash uses milliseconds
+ }
+ }
+ private function fl_play_head(percent:Number):Boolean {
+ log("play_head: "+percent+"%");
+ if(isMp3) {
+ return myMp3Player.playHead(percent);
+ } else {
+ return myMp4Player.playHead(percent);
+ }
+ }
+ private function fl_volume(v:Number):void {
+ log("volume: "+v);
+ commonStatus.volume = v;
+ if(!commonStatus.muted) {
+ myMp3Player.setVolume(v);
+ myMp4Player.setVolume(v);
+ }
+ }
+ private function fl_mute(mute:Boolean):void {
+ log("mute: "+mute);
+ commonStatus.muted = mute;
+ if(mute) {
+ myMp3Player.setVolume(0);
+ myMp4Player.setVolume(0);
+ } else {
+ myMp3Player.setVolume(commonStatus.volume);
+ myMp4Player.setVolume(commonStatus.volume);
+ }
+ }
+ private function jPlayerFlashEvent(e:JplayerEvent):void {
+ log("jPlayer Flash Event: " + e.type + ": " + e.target);
+ if(ExternalInterface.available) {
+ ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data));
+ }
+ }
+ private function extractStatusData(data:JplayerStatus):Object {
+ var myStatus:Object = {
+ version: JplayerStatus.VERSION,
+ src: data.src,
+ paused: !data.isPlaying, // Changing this name requires inverting all assignments and conditional statements.
+ srcSet: data.srcSet,
+ seekPercent: data.seekPercent,
+ currentPercentRelative: data.currentPercentRelative,
+ currentPercentAbsolute: data.currentPercentAbsolute,
+ currentTime: data.currentTime / 1000, // JavaScript uses seconds
+ duration: data.duration / 1000, // JavaScript uses seconds
+ volume: commonStatus.volume,
+ muted: commonStatus.muted
+ };
+ log("extractStatusData: sp="+myStatus.seekPercent+" cpr="+myStatus.currentPercentRelative+" cpa="+myStatus.currentPercentAbsolute+" ct="+myStatus.currentTime+" d="+myStatus.duration);
+ return myStatus;
+ }
+ private function jPlayerMetaDataHandler(e:JplayerEvent):void {
+ log("jPlayerMetaDataHandler:" + e.target);
+ if(ExternalInterface.available) {
+ resizeHandler(new Event(Event.RESIZE));
+ ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data));
+ }
+ }
+ private function resizeHandler(e:Event):void {
+ log("resizeHandler: stageWidth = " + stage.stageWidth + " | stageHeight = " + stage.stageHeight);
+
+ var mediaX:Number = 0;
+ var mediaY:Number = 0;
+ var mediaWidth:Number = 0;
+ var mediaHeight:Number = 0;
+
+ if(stage.stageWidth > 0 && stage.stageHeight > 0 && myMp4Player.myVideo.width > 0 && myMp4Player.myVideo.height > 0) {
+ var aspectRatioStage:Number = stage.stageWidth / stage.stageHeight;
+ var aspectRatioVideo:Number = myMp4Player.myVideo.width / myMp4Player.myVideo.height;
+ if(aspectRatioStage < aspectRatioVideo) {
+ mediaWidth = stage.stageWidth;
+ mediaHeight = stage.stageWidth / aspectRatioVideo;
+ mediaX = 0;
+ mediaY = (stage.stageHeight - mediaHeight) / 2;
+ } else {
+ mediaWidth = stage.stageHeight * aspectRatioVideo;
+ mediaHeight = stage.stageHeight;
+ mediaX = (stage.stageWidth - mediaWidth) / 2;
+ mediaY = 0;
+ }
+ resizeEntity(myMp4Player, mediaX, mediaY, mediaWidth, mediaHeight);
+ }
+ if(debug && stage.stageWidth > 20 && stage.stageHeight > 20) {
+ txLog.width = stage.stageWidth - 10;
+ txLog.height = stage.stageHeight - 10;
+ }
+ }
+ private function resizeEntity(entity:Sprite, mediaX:Number, mediaY:Number, mediaWidth:Number, mediaHeight:Number):void {
+ entity.x = mediaX;
+ entity.y = mediaY;
+ entity.width = mediaWidth;
+ entity.height = mediaHeight;
+ }
+ private function clickHandler(e:MouseEvent):void {
+ if(isMp3) {
+ jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp3Player.myStatus, "click"))
+ } else {
+ jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp4Player.myStatus, "click"))
+ }
+ }
+ // This event is never called. See comments in class constructor.
+ private function menuSelectHandler_jPlayer(e:ContextMenuEvent):void {
+ navigateToURL(new URLRequest("http://jplayer.org/"), "_blank");
+ }
+ // This event is never called. See comments in class constructor.
+ private function menuSelectHandler_happyworm(e:ContextMenuEvent):void {
+ navigateToURL(new URLRequest("http://happyworm.com/"), "_blank");
+ }
+ private function log(t:String):void {
+ if(debug) {
+ txLog.text = t + "\n" + txLog.text;
+ }
+ }
+ private function debugMsgHandler(e:JplayerEvent):void {
+ log(e.msg);
+ }
+ private function keyboardHandler(e:KeyboardEvent):void {
+ log("keyboardHandler: e.keyCode = " + e.keyCode);
+ switch(e.keyCode) {
+ case 68 : // d
+ txLog.visible = !txLog.visible;
+ log("Toggled log display: " + txLog.visible);
+ break;
+ case 76 : // l
+ if(e.ctrlKey && e.shiftKey) {
+ txLog.text = "Cleared log.";
+ }
+ break;
+ }
+ }
+ }
+}
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.fla b/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.fla
new file mode 100644
index 00000000000..61ae40d3ac2
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.fla
Binary files differ
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jplayer.playlist.js b/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jplayer.playlist.js
new file mode 100644
index 00000000000..0eaa0ddf3d7
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jplayer.playlist.js
@@ -0,0 +1,452 @@
+/*
+ * Playlist Object for the jPlayer Plugin
+ * http://www.jplayer.org
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Version: 2.1.0 (jPlayer 2.1.0)
+ * Date: 1st September 2011
+ */
+
+/* Code verified using http://www.jshint.com/ */
+/*jshint asi:false, bitwise:false, boss:false, browser:true, curly:true, debug:false, eqeqeq:true, eqnull:false, evil:false, forin:false, immed:false, jquery:true, laxbreak:false, newcap:true, noarg:true, noempty:true, nonew:true, nomem:false, onevar:false, passfail:false, plusplus:false, regexp:false, undef:true, sub:false, strict:false, white:false */
+/*global jPlayerPlaylist: true, jQuery:false, alert:false */
+
+(function($, undefined) {
+
+ jPlayerPlaylist = function(cssSelector, playlist, options) {
+ var self = this;
+
+ this.current = 0;
+ this.loop = false; // Flag used with the jPlayer repeat event
+ this.shuffled = false;
+ this.removing = false; // Flag is true during remove animation, disabling the remove() method until complete.
+
+ this.cssSelector = $.extend({}, this._cssSelector, cssSelector); // Object: Containing the css selectors for jPlayer and its cssSelectorAncestor
+ this.options = $.extend(true, {}, this._options, options); // Object: The jPlayer constructor options for this playlist and the playlist options
+
+ this.playlist = []; // Array of Objects: The current playlist displayed (Un-shuffled or Shuffled)
+ this.original = []; // Array of Objects: The original playlist
+
+ this._initPlaylist(playlist); // Copies playlist to this.original. Then mirrors this.original to this.playlist. Creating two arrays, where the element pointers match. (Enables pointer comparison.)
+
+ // Setup the css selectors for the extra interface items used by the playlist.
+ this.cssSelector.title = this.cssSelector.cssSelectorAncestor + " .jp-title"; // Note that the text is written to the decendant li node.
+ this.cssSelector.playlist = this.cssSelector.cssSelectorAncestor + " .jp-playlist";
+ this.cssSelector.next = this.cssSelector.cssSelectorAncestor + " .jp-next";
+ this.cssSelector.previous = this.cssSelector.cssSelectorAncestor + " .jp-previous";
+ this.cssSelector.shuffle = this.cssSelector.cssSelectorAncestor + " .jp-shuffle";
+ this.cssSelector.shuffleOff = this.cssSelector.cssSelectorAncestor + " .jp-shuffle-off";
+
+ // Override the cssSelectorAncestor given in options
+ this.options.cssSelectorAncestor = this.cssSelector.cssSelectorAncestor;
+
+ // Override the default repeat event handler
+ this.options.repeat = function(event) {
+ self.loop = event.jPlayer.options.loop;
+ };
+
+ // Create a ready event handler to initialize the playlist
+ $(this.cssSelector.jPlayer).bind($.jPlayer.event.ready, function(event) {
+ self._init();
+ });
+
+ // Create an ended event handler to move to the next item
+ $(this.cssSelector.jPlayer).bind($.jPlayer.event.ended, function(event) {
+ self.next();
+ });
+
+ // Create a play event handler to pause other instances
+ $(this.cssSelector.jPlayer).bind($.jPlayer.event.play, function(event) {
+ $(this).jPlayer("pauseOthers");
+ });
+
+ // Create a resize event handler to show the title in full screen mode.
+ $(this.cssSelector.jPlayer).bind($.jPlayer.event.resize, function(event) {
+ if(event.jPlayer.options.fullScreen) {
+ $(self.cssSelector.title).show();
+ } else {
+ $(self.cssSelector.title).hide();
+ }
+ });
+
+ // Create click handlers for the extra buttons that do playlist functions.
+ $(this.cssSelector.previous).click(function() {
+ self.previous();
+ $(this).blur();
+ return false;
+ });
+
+ $(this.cssSelector.next).click(function() {
+ self.next();
+ $(this).blur();
+ return false;
+ });
+
+ $(this.cssSelector.shuffle).click(function() {
+ self.shuffle(true);
+ return false;
+ });
+ $(this.cssSelector.shuffleOff).click(function() {
+ self.shuffle(false);
+ return false;
+ }).hide();
+
+ // Put the title in its initial display state
+ if(!this.options.fullScreen) {
+ $(this.cssSelector.title).hide();
+ }
+
+ // Remove the empty <li> from the page HTML. Allows page to be valid HTML, while not interfereing with display animations
+ $(this.cssSelector.playlist + " ul").empty();
+
+ // Create .live() handlers for the playlist items along with the free media and remove controls.
+ this._createItemHandlers();
+
+ // Instance jPlayer
+ $(this.cssSelector.jPlayer).jPlayer(this.options);
+ };
+
+ jPlayerPlaylist.prototype = {
+ _cssSelector: { // static object, instanced in constructor
+ jPlayer: "#jquery_jplayer_1",
+ cssSelectorAncestor: "#jp_container_1"
+ },
+ _options: { // static object, instanced in constructor
+ playlistOptions: {
+ autoPlay: false,
+ loopOnPrevious: false,
+ shuffleOnLoop: true,
+ enableRemoveControls: false,
+ displayTime: 'slow',
+ addTime: 'fast',
+ removeTime: 'fast',
+ shuffleTime: 'slow',
+ itemClass: "jp-playlist-item",
+ freeGroupClass: "jp-free-media",
+ freeItemClass: "jp-playlist-item-free",
+ removeItemClass: "jp-playlist-item-remove"
+ }
+ },
+ option: function(option, value) { // For changing playlist options only
+ if(value === undefined) {
+ return this.options.playlistOptions[option];
+ }
+
+ this.options.playlistOptions[option] = value;
+
+ switch(option) {
+ case "enableRemoveControls":
+ this._updateControls();
+ break;
+ case "itemClass":
+ case "freeGroupClass":
+ case "freeItemClass":
+ case "removeItemClass":
+ this._refresh(true); // Instant
+ this._createItemHandlers();
+ break;
+ }
+ return this;
+ },
+ _init: function() {
+ var self = this;
+ this._refresh(function() {
+ if(self.options.playlistOptions.autoPlay) {
+ self.play(self.current);
+ } else {
+ self.select(self.current);
+ }
+ });
+ },
+ _initPlaylist: function(playlist) {
+ this.current = 0;
+ this.shuffled = false;
+ this.removing = false;
+ this.original = $.extend(true, [], playlist); // Copy the Array of Objects
+ this._originalPlaylist();
+ },
+ _originalPlaylist: function() {
+ var self = this;
+ this.playlist = [];
+ // Make both arrays point to the same object elements. Gives us 2 different arrays, each pointing to the same actual object. ie., Not copies of the object.
+ $.each(this.original, function(i,v) {
+ self.playlist[i] = self.original[i];
+ });
+ },
+ _refresh: function(instant) {
+ /* instant: Can be undefined, true or a function.
+ * undefined -> use animation timings
+ * true -> no animation
+ * function -> use animation timings and excute function at half way point.
+ */
+ var self = this;
+
+ if(instant && !$.isFunction(instant)) {
+ $(this.cssSelector.playlist + " ul").empty();
+ $.each(this.playlist, function(i,v) {
+ $(self.cssSelector.playlist + " ul").append(self._createListItem(self.playlist[i]));
+ });
+ this._updateControls();
+ } else {
+ var displayTime = $(this.cssSelector.playlist + " ul").children().length ? this.options.playlistOptions.displayTime : 0;
+
+ $(this.cssSelector.playlist + " ul").slideUp(displayTime, function() {
+ var $this = $(this);
+ $(this).empty();
+
+ $.each(self.playlist, function(i,v) {
+ $this.append(self._createListItem(self.playlist[i]));
+ });
+ self._updateControls();
+ if($.isFunction(instant)) {
+ instant();
+ }
+ if(self.playlist.length) {
+ $(this).slideDown(self.options.playlistOptions.displayTime);
+ } else {
+ $(this).show();
+ }
+ });
+ }
+ },
+ _createListItem: function(media) {
+ var self = this;
+
+ // Wrap the <li> contents in a <div>
+ var listItem = "<li><div>";
+
+ // Create remove control
+ listItem += "<a href='javascript:;' class='" + this.options.playlistOptions.removeItemClass + "'>&times;</a>";
+
+ // Create links to free media
+ if(media.free) {
+ var first = true;
+ listItem += "<span class='" + this.options.playlistOptions.freeGroupClass + "'>(";
+ $.each(media, function(property,value) {
+ if($.jPlayer.prototype.format[property]) { // Check property is a media format.
+ if(first) {
+ first = false;
+ } else {
+ listItem += " | ";
+ }
+ listItem += "<a class='" + self.options.playlistOptions.freeItemClass + "' href='" + value + "' tabindex='1'>" + property + "</a>";
+ }
+ });
+ listItem += ")</span>";
+ }
+
+ // The title is given next in the HTML otherwise the float:right on the free media corrupts in IE6/7
+ listItem += "<a href='javascript:;' class='" + this.options.playlistOptions.itemClass + "' tabindex='1'>" + media.title + (media.artist ? " <span class='jp-artist'>by " + media.artist + "</span>" : "") + "</a>";
+ listItem += "</div></li>";
+
+ return listItem;
+ },
+ _createItemHandlers: function() {
+ var self = this;
+ // Create .live() handlers for the playlist items
+ $(this.cssSelector.playlist + " a." + this.options.playlistOptions.itemClass).die("click").live("click", function() {
+ var index = $(this).parent().parent().index();
+ if(self.current !== index) {
+ self.play(index);
+ } else {
+ $(self.cssSelector.jPlayer).jPlayer("play");
+ }
+ $(this).blur();
+ return false;
+ });
+
+ // Create .live() handlers that disable free media links to force access via right click
+ $(self.cssSelector.playlist + " a." + this.options.playlistOptions.freeItemClass).die("click").live("click", function() {
+ $(this).parent().parent().find("." + self.options.playlistOptions.itemClass).click();
+ $(this).blur();
+ return false;
+ });
+
+ // Create .live() handlers for the remove controls
+ $(self.cssSelector.playlist + " a." + this.options.playlistOptions.removeItemClass).die("click").live("click", function() {
+ var index = $(this).parent().parent().index();
+ self.remove(index);
+ $(this).blur();
+ return false;
+ });
+ },
+ _updateControls: function() {
+ if(this.options.playlistOptions.enableRemoveControls) {
+ $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).show();
+ } else {
+ $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).hide();
+ }
+ if(this.shuffled) {
+ $(this.cssSelector.shuffleOff).show();
+ $(this.cssSelector.shuffle).hide();
+ } else {
+ $(this.cssSelector.shuffleOff).hide();
+ $(this.cssSelector.shuffle).show();
+ }
+ },
+ _highlight: function(index) {
+ if(this.playlist.length && index !== undefined) {
+ $(this.cssSelector.playlist + " .jp-playlist-current").removeClass("jp-playlist-current");
+ $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current");
+ $(this.cssSelector.title + " li").html(this.playlist[index].title + (this.playlist[index].artist ? " <span class='jp-artist'>by " + this.playlist[index].artist + "</span>" : ""));
+ }
+ },
+ setPlaylist: function(playlist) {
+ this._initPlaylist(playlist);
+ this._init();
+ },
+ add: function(media, playNow) {
+ $(this.cssSelector.playlist + " ul").append(this._createListItem(media)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime);
+ this._updateControls();
+ this.original.push(media);
+ this.playlist.push(media); // Both array elements share the same object pointer. Comforms with _initPlaylist(p) system.
+
+ if(playNow) {
+ this.play(this.playlist.length - 1);
+ } else {
+ if(this.original.length === 1) {
+ this.select(0);
+ }
+ }
+ },
+ remove: function(index) {
+ var self = this;
+
+ if(index === undefined) {
+ this._initPlaylist([]);
+ this._refresh(function() {
+ $(self.cssSelector.jPlayer).jPlayer("clearMedia");
+ });
+ return true;
+ } else {
+
+ if(this.removing) {
+ return false;
+ } else {
+ index = (index < 0) ? self.original.length + index : index; // Negative index relates to end of array.
+ if(0 <= index && index < this.playlist.length) {
+ this.removing = true;
+
+ $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").slideUp(this.options.playlistOptions.removeTime, function() {
+ $(this).remove();
+
+ if(self.shuffled) {
+ var item = self.playlist[index];
+ $.each(self.original, function(i,v) {
+ if(self.original[i] === item) {
+ self.original.splice(i, 1);
+ return false; // Exit $.each
+ }
+ });
+ self.playlist.splice(index, 1);
+ } else {
+ self.original.splice(index, 1);
+ self.playlist.splice(index, 1);
+ }
+
+ if(self.original.length) {
+ if(index === self.current) {
+ self.current = (index < self.original.length) ? self.current : self.original.length - 1; // To cope when last element being selected when it was removed
+ self.select(self.current);
+ } else if(index < self.current) {
+ self.current--;
+ }
+ } else {
+ $(self.cssSelector.jPlayer).jPlayer("clearMedia");
+ self.current = 0;
+ self.shuffled = false;
+ self._updateControls();
+ }
+
+ self.removing = false;
+ });
+ }
+ return true;
+ }
+ }
+ },
+ select: function(index) {
+ index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array.
+ if(0 <= index && index < this.playlist.length) {
+ this.current = index;
+ this._highlight(index);
+ $(this.cssSelector.jPlayer).jPlayer("setMedia", this.playlist[this.current]);
+ } else {
+ this.current = 0;
+ }
+ },
+ play: function(index) {
+ index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array.
+ if(0 <= index && index < this.playlist.length) {
+ if(this.playlist.length) {
+ this.select(index);
+ $(this.cssSelector.jPlayer).jPlayer("play");
+ }
+ } else if(index === undefined) {
+ $(this.cssSelector.jPlayer).jPlayer("play");
+ }
+ },
+ pause: function() {
+ $(this.cssSelector.jPlayer).jPlayer("pause");
+ },
+ next: function() {
+ var index = (this.current + 1 < this.playlist.length) ? this.current + 1 : 0;
+
+ if(this.loop) {
+ // See if we need to shuffle before looping to start, and only shuffle if more than 1 item.
+ if(index === 0 && this.shuffled && this.options.playlistOptions.shuffleOnLoop && this.playlist.length > 1) {
+ this.shuffle(true, true); // playNow
+ } else {
+ this.play(index);
+ }
+ } else {
+ // The index will be zero if it just looped round
+ if(index > 0) {
+ this.play(index);
+ }
+ }
+ },
+ previous: function() {
+ var index = (this.current - 1 >= 0) ? this.current - 1 : this.playlist.length - 1;
+
+ if(this.loop && this.options.playlistOptions.loopOnPrevious || index < this.playlist.length - 1) {
+ this.play(index);
+ }
+ },
+ shuffle: function(shuffled, playNow) {
+ var self = this;
+
+ if(shuffled === undefined) {
+ shuffled = !this.shuffled;
+ }
+
+ if(shuffled || shuffled !== this.shuffled) {
+
+ $(this.cssSelector.playlist + " ul").slideUp(this.options.playlistOptions.shuffleTime, function() {
+ self.shuffled = shuffled;
+ if(shuffled) {
+ self.playlist.sort(function() {
+ return 0.5 - Math.random();
+ });
+ } else {
+ self._originalPlaylist();
+ }
+ self._refresh(true); // Instant
+
+ if(playNow || !$(self.cssSelector.jPlayer).data("jPlayer").status.paused) {
+ self.play(0);
+ } else {
+ self.select(0);
+ }
+
+ $(this).slideDown(self.options.playlistOptions.shuffleTime);
+ });
+ }
+ }
+ };
+})(jQuery);
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jquery.jplayer.inspector.js b/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jquery.jplayer.inspector.js
new file mode 100644
index 00000000000..46c090a1b01
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jquery.jplayer.inspector.js
@@ -0,0 +1,331 @@
+/*
+ * jPlayerInspector Plugin for jPlayer (2.0.0+) Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Version: 1.0.3
+ * Date: 7th August 2011
+ *
+ * For use with jPlayer Version: 2.0.29
+ *
+ * Note: Declare inspector instances after jPlayer instances. ie., Otherwise the jPlayer instance is nonsense.
+ */
+
+(function($, undefined) {
+ $.jPlayerInspector = {};
+ $.jPlayerInspector.i = 0;
+ $.jPlayerInspector.defaults = {
+ jPlayer: undefined, // The jQuery selector of the jPlayer instance to inspect.
+ idPrefix: "jplayer_inspector_",
+ visible: false
+ };
+
+ var methods = {
+ init: function(options) {
+ var self = this;
+ var $this = $(this);
+
+ var config = $.extend({}, $.jPlayerInspector.defaults, options);
+ $(this).data("jPlayerInspector", config);
+
+ config.id = $(this).attr("id");
+ config.jPlayerId = config.jPlayer.attr("id");
+
+ config.windowId = config.idPrefix + "window_" + $.jPlayerInspector.i;
+ config.statusId = config.idPrefix + "status_" + $.jPlayerInspector.i;
+ config.configId = config.idPrefix + "config_" + $.jPlayerInspector.i;
+ config.toggleId = config.idPrefix + "toggle_" + $.jPlayerInspector.i;
+ config.eventResetId = config.idPrefix + "event_reset_" + $.jPlayerInspector.i;
+ config.updateId = config.idPrefix + "update_" + $.jPlayerInspector.i;
+ config.eventWindowId = config.idPrefix + "event_window_" + $.jPlayerInspector.i;
+
+ config.eventId = {};
+ config.eventJq = {};
+ config.eventTimeout = {};
+ config.eventOccurrence = {};
+
+ $.each($.jPlayer.event, function(eventName,eventType) {
+ config.eventId[eventType] = config.idPrefix + "event_" + eventName + "_" + $.jPlayerInspector.i;
+ config.eventOccurrence[eventType] = 0;
+ });
+
+ var structure =
+ '<p><a href="#" id="' + config.toggleId + '">' + (config.visible ? "Hide" : "Show") + '</a> jPlayer Inspector</p>'
+ + '<div id="' + config.windowId + '">'
+ + '<div id="' + config.statusId + '"></div>'
+ + '<div id="' + config.eventWindowId + '" style="padding:5px 5px 0 5px;background-color:#eee;border:1px dotted #000;">'
+ + '<p style="margin:0 0 10px 0;"><strong>jPlayer events that have occurred over the past 1 second:</strong>'
+ + '<br />(Backgrounds: <span style="padding:0 5px;background-color:#eee;border:1px dotted #000;">Never occurred</span> <span style="padding:0 5px;background-color:#fff;border:1px dotted #000;">Occurred before</span> <span style="padding:0 5px;background-color:#9f9;border:1px dotted #000;">Occurred</span> <span style="padding:0 5px;background-color:#ff9;border:1px dotted #000;">Multiple occurrences</span> <a href="#" id="' + config.eventResetId + '">reset</a>)</p>';
+
+ // MJP: Would use the next 3 lines for ease, but the events are just slapped on the page.
+ // $.each($.jPlayer.event, function(eventName,eventType) {
+ // structure += '<div id="' + config.eventId[eventType] + '" style="float:left;">' + eventName + '</div>';
+ // });
+
+ var eventStyle = "float:left;margin:0 5px 5px 0;padding:0 5px;border:1px dotted #000;";
+ // MJP: Doing it longhand so order and layout easier to control.
+ structure +=
+ '<div id="' + config.eventId[$.jPlayer.event.ready] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.flashreset] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.resize] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.repeat] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.click] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.error] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.warning] + '" style="' + eventStyle + '"></div>'
+
+ + '<div id="' + config.eventId[$.jPlayer.event.loadstart] + '" style="clear:left;' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.progress] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.timeupdate] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.volumechange] + '" style="' + eventStyle + '"></div>'
+
+ + '<div id="' + config.eventId[$.jPlayer.event.play] + '" style="clear:left;' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.pause] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.waiting] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.playing] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.seeking] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.seeked] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.ended] + '" style="' + eventStyle + '"></div>'
+
+ + '<div id="' + config.eventId[$.jPlayer.event.loadeddata] + '" style="clear:left;' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.loadedmetadata] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.canplay] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.canplaythrough] + '" style="' + eventStyle + '"></div>'
+
+ + '<div id="' + config.eventId[$.jPlayer.event.suspend] + '" style="clear:left;' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.abort] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.emptied] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.stalled] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.ratechange] + '" style="' + eventStyle + '"></div>'
+ + '<div id="' + config.eventId[$.jPlayer.event.durationchange] + '" style="' + eventStyle + '"></div>'
+
+ + '<div style="clear:both"></div>';
+
+ // MJP: Would like a check here in case we missed an event.
+
+ // MJP: Check fails, since it is not on the page yet.
+/* $.each($.jPlayer.event, function(eventName,eventType) {
+ if($("#" + config.eventId[eventType])[0] === undefined) {
+ structure += '<div id="' + config.eventId[eventType] + '" style="clear:left;' + eventStyle + '">' + eventName + '</div>';
+ }
+ });
+*/
+ structure +=
+ '</div>'
+ + '<p><a href="#" id="' + config.updateId + '">Update</a> jPlayer Inspector</p>'
+ + '<div id="' + config.configId + '"></div>'
+ + '</div>';
+ $(this).html(structure);
+
+ config.windowJq = $("#" + config.windowId);
+ config.statusJq = $("#" + config.statusId);
+ config.configJq = $("#" + config.configId);
+ config.toggleJq = $("#" + config.toggleId);
+ config.eventResetJq = $("#" + config.eventResetId);
+ config.updateJq = $("#" + config.updateId);
+
+ $.each($.jPlayer.event, function(eventName,eventType) {
+ config.eventJq[eventType] = $("#" + config.eventId[eventType]);
+ config.eventJq[eventType].text(eventName + " (" + config.eventOccurrence[eventType] + ")"); // Sets the text to the event name and (0);
+
+ config.jPlayer.bind(eventType + ".jPlayerInspector", function(e) {
+ config.eventOccurrence[e.type]++;
+ if(config.eventOccurrence[e.type] > 1) {
+ config.eventJq[e.type].css("background-color","#ff9");
+ } else {
+ config.eventJq[e.type].css("background-color","#9f9");
+ }
+ config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")");
+ // The timer to handle the color
+ clearTimeout(config.eventTimeout[e.type]);
+ config.eventTimeout[e.type] = setTimeout(function() {
+ config.eventJq[e.type].css("background-color","#fff");
+ }, 1000);
+ // The timer to handle the occurences.
+ setTimeout(function() {
+ config.eventOccurrence[e.type]--;
+ config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")");
+ }, 1000);
+ if(config.visible) { // Update the status, if inspector open.
+ $this.jPlayerInspector("updateStatus");
+ }
+ });
+ });
+
+ config.jPlayer.bind($.jPlayer.event.ready + ".jPlayerInspector", function(e) {
+ $this.jPlayerInspector("updateConfig");
+ });
+
+ config.toggleJq.click(function() {
+ if(config.visible) {
+ $(this).text("Show");
+ config.windowJq.hide();
+ config.statusJq.empty();
+ config.configJq.empty();
+ } else {
+ $(this).text("Hide");
+ config.windowJq.show();
+ config.updateJq.click();
+ }
+ config.visible = !config.visible;
+ $(this).blur();
+ return false;
+ });
+
+ config.eventResetJq.click(function() {
+ $.each($.jPlayer.event, function(eventName,eventType) {
+ config.eventJq[eventType].css("background-color","#eee");
+ });
+ $(this).blur();
+ return false;
+ });
+
+ config.updateJq.click(function() {
+ $this.jPlayerInspector("updateStatus");
+ $this.jPlayerInspector("updateConfig");
+ return false;
+ });
+
+ if(!config.visible) {
+ config.windowJq.hide();
+ } else {
+ // config.updateJq.click();
+ }
+
+ $.jPlayerInspector.i++;
+
+ return this;
+ },
+ destroy: function() {
+ $(this).data("jPlayerInspector") && $(this).data("jPlayerInspector").jPlayer.unbind(".jPlayerInspector");
+ $(this).empty();
+ },
+ updateConfig: function() { // This displays information about jPlayer's configuration in inspector
+
+ var jPlayerInfo = "<p>This jPlayer instance is running in your browser where:<br />"
+
+ for(i = 0; i < $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions.length; i++) {
+ var solution = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions[i];
+ jPlayerInfo += "&nbsp;jPlayer's <strong>" + solution + "</strong> solution is";
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].used) {
+ jPlayerInfo += " being <strong>used</strong> and will support:<strong>";
+ for(format in $(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support) {
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support[format]) {
+ jPlayerInfo += " " + format;
+ }
+ }
+ jPlayerInfo += "</strong><br />";
+ } else {
+ jPlayerInfo += " <strong>not required</strong><br />";
+ }
+ }
+ jPlayerInfo += "</p>";
+
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.active) {
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) {
+ jPlayerInfo += "<strong>Problem with jPlayer since both HTML5 and Flash are active.</strong>";
+ } else {
+ jPlayerInfo += "The <strong>HTML5 is active</strong>.";
+ }
+ } else {
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) {
+ jPlayerInfo += "The <strong>Flash is active</strong>.";
+ } else {
+ jPlayerInfo += "No solution is currently active. jPlayer needs a setMedia().";
+ }
+ }
+ jPlayerInfo += "</p>";
+
+ var formatType = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.formatType;
+ jPlayerInfo += "<p><code>status.formatType = '" + formatType + "'</code><br />";
+ if(formatType) {
+ jPlayerInfo += "<code>Browser canPlay('" + $.jPlayer.prototype.format[formatType].codec + "')</code>";
+ } else {
+ jPlayerInfo += "</p>";
+ }
+
+ jPlayerInfo += "<p><code>status.src = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.src + "'</code></p>";
+
+ jPlayerInfo += "<p><code>status.media = {<br />";
+ for(prop in $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media) {
+ jPlayerInfo += "&nbsp;" + prop + ": " + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media[prop] + "<br />"; // Some are strings
+ }
+ jPlayerInfo += "};</code></p>"
+
+ + "<p>Raw browser test for HTML5 support. Should equal a function if HTML5 is available.<br />";
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.audio.available) {
+ jPlayerInfo += "<code>htmlElement.audio.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.audio.canPlayType) +"</code><br />"
+ }
+ if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.video.available) {
+ jPlayerInfo += "<code>htmlElement.video.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.video.canPlayType) +"</code>";
+ }
+ jPlayerInfo += "</p>";
+
+ jPlayerInfo += "<p>This instance is using the constructor options:<br />"
+ + "<code>$('#" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").internal.self.id + "').jPlayer({<br />"
+
+ + "&nbsp;swfPath: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "swfPath") + "',<br />"
+
+ + "&nbsp;solution: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "solution") + "',<br />"
+
+ + "&nbsp;supplied: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "supplied") + "',<br />"
+
+ + "&nbsp;preload: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "preload") + "',<br />"
+
+ + "&nbsp;volume: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "volume") + ",<br />"
+
+ + "&nbsp;muted: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "muted") + ",<br />"
+
+ + "&nbsp;backgroundColor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "backgroundColor") + "',<br />"
+
+ + "&nbsp;cssSelectorAncestor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelectorAncestor") + "',<br />"
+
+ + "&nbsp;cssSelector: {";
+
+ var cssSelector = $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector");
+ for(prop in cssSelector) {
+
+ // jPlayerInfo += "<br />&nbsp;&nbsp;" + prop + ": '" + cssSelector[prop] + "'," // This works too of course, but want to use option method for deep keys.
+ jPlayerInfo += "<br />&nbsp;&nbsp;" + prop + ": '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector." + prop) + "',"
+ }
+
+ jPlayerInfo = jPlayerInfo.slice(0, -1); // Because the sloppy comma was bugging me.
+
+ jPlayerInfo += "<br />&nbsp;},<br />"
+
+ + "&nbsp;errorAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "errorAlerts") + ",<br />"
+
+ + "&nbsp;warningAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "warningAlerts") + "<br />"
+
+ + "});</code></p>";
+ $(this).data("jPlayerInspector").configJq.html(jPlayerInfo);
+ return this;
+ },
+ updateStatus: function() { // This displays information about jPlayer's status in the inspector
+ $(this).data("jPlayerInspector").statusJq.html(
+ "<p>jPlayer is " +
+ ($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.paused ? "paused" : "playing") +
+ " at time: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentTime*10)/10 + "s." +
+ " (d: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.duration*10)/10 + "s" +
+ ", sp: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.seekPercent) + "%" +
+ ", cpr: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentRelative) + "%" +
+ ", cpa: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentAbsolute) + "%)</p>"
+ );
+ return this;
+ }
+ };
+ $.fn.jPlayerInspector = function( method ) {
+ // Method calling logic
+ if ( methods[method] ) {
+ return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
+ } else if ( typeof method === 'object' || ! method ) {
+ return methods.init.apply( this, arguments );
+ } else {
+ $.error( 'Method ' + method + ' does not exist on jQuery.jPlayerInspector' );
+ }
+ };
+})(jQuery);
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerEvent.as b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerEvent.as
new file mode 100644
index 00000000000..addb97a7ae4
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerEvent.as
@@ -0,0 +1,69 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Date: 8th August 2011
+ */
+
+package happyworm.jPlayer {
+ import flash.events.Event;
+
+ public class JplayerEvent extends Event {
+
+ // The event strings must match those in the JavaScript's $.jPlayer.event object
+
+ public static const JPLAYER_READY:String = "jPlayer_ready";
+ public static const JPLAYER_FLASHRESET:String = "jPlayer_flashreset"; // Handled in JavaScript
+ public static const JPLAYER_RESIZE:String = "jPlayer_resize"; // Handled in JavaScript
+ public static const JPLAYER_REPEAT:String = "jPlayer_repeat"; // Handled in JavaScript
+ public static const JPLAYER_CLICK:String = "jPlayer_click";
+ public static const JPLAYER_ERROR:String = "jPlayer_error";
+ public static const JPLAYER_WARNING:String = "jPlayer_warning"; // Currently not used by the flash solution
+
+ public static const JPLAYER_LOADSTART:String = "jPlayer_loadstart";
+ public static const JPLAYER_PROGRESS:String = "jPlayer_progress";
+ public static const JPLAYER_SUSPEND:String = "jPlayer_suspend"; // Not implemented
+ public static const JPLAYER_ABORT:String = "jPlayer_abort"; // Not implemented
+ public static const JPLAYER_EMPTIED:String = "jPlayer_emptied"; // Not implemented
+ public static const JPLAYER_STALLED:String = "jPlayer_stalled"; // Not implemented
+ public static const JPLAYER_PLAY:String = "jPlayer_play";
+ public static const JPLAYER_PAUSE:String = "jPlayer_pause";
+ public static const JPLAYER_LOADEDMETADATA:String = "jPlayer_loadedmetadata"; // MP3 has no equivilent
+ public static const JPLAYER_LOADEDDATA:String = "jPlayer_loadeddata"; // Not implemented
+ public static const JPLAYER_WAITING:String = "jPlayer_waiting"; // Not implemented
+ public static const JPLAYER_PLAYING:String = "jPlayer_playing"; // Not implemented
+ public static const JPLAYER_CANPLAY:String = "jPlayer_canplay"; // Not implemented
+ public static const JPLAYER_CANPLAYTHROUGH:String = "jPlayer_canplaythrough"; // Not implemented
+ public static const JPLAYER_SEEKING:String = "jPlayer_seeking";
+ public static const JPLAYER_SEEKED:String = "jPlayer_seeked";
+ public static const JPLAYER_TIMEUPDATE:String = "jPlayer_timeupdate";
+ public static const JPLAYER_ENDED:String = "jPlayer_ended";
+ public static const JPLAYER_RATECHANGE:String = "jPlayer_ratechange"; // Not implemented
+ public static const JPLAYER_DURATIONCHANGE:String = "jPlayer_durationchange"; // Not implemented
+ public static const JPLAYER_VOLUMECHANGE:String = "jPlayer_volumechange"; // See JavaScript
+
+ // Events used internal to jPlayer's Flash.
+ public static const DEBUG_MSG:String = "debug_msg";
+
+ public var data:JplayerStatus;
+ public var msg:String = ""
+
+ public function JplayerEvent(type:String, data:JplayerStatus, msg:String = "", bubbles:Boolean = false, cancelable:Boolean = false) {
+ super(type, bubbles, cancelable);
+ this.data = data;
+ this.msg = msg;
+ }
+ public override function clone():Event {
+ return new JplayerEvent(type, data, msg, bubbles, cancelable);
+ }
+ public override function toString():String {
+ return formatToString("JplayerEvent", "type", "bubbles", "cancelable", "eventPhase", "data", "msg");
+ }
+ }
+} \ No newline at end of file
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp3.as b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp3.as
new file mode 100644
index 00000000000..8c51d5b7633
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp3.as
@@ -0,0 +1,328 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Date: 1st September 2011
+ */
+
+package happyworm.jPlayer {
+ import flash.display.Sprite;
+
+ import flash.media.Sound;
+ import flash.media.SoundChannel;
+ import flash.media.SoundLoaderContext;
+ import flash.media.SoundTransform;
+ import flash.net.URLRequest;
+ import flash.utils.Timer;
+ import flash.errors.IOError;
+ import flash.events.*;
+
+ public class JplayerMp3 extends Sprite {
+ private var mySound:Sound = new Sound();
+ private var myChannel:SoundChannel = new SoundChannel();
+ private var myContext:SoundLoaderContext = new SoundLoaderContext(3000, false);
+ private var myTransform:SoundTransform = new SoundTransform();
+ private var myRequest:URLRequest = new URLRequest();
+
+ private var timeUpdateTimer:Timer = new Timer(250, 0); // Matched to HTML event freq
+ private var progressTimer:Timer = new Timer(250, 0); // Matched to HTML event freq
+ private var seekingTimer:Timer = new Timer(100, 0); // Internal: How often seeking is checked to see if it is over.
+
+ public var myStatus:JplayerStatus = new JplayerStatus();
+
+ public function JplayerMp3(volume:Number) {
+ timeUpdateTimer.addEventListener(TimerEvent.TIMER, timeUpdateHandler);
+ progressTimer.addEventListener(TimerEvent.TIMER, progressHandler);
+ seekingTimer.addEventListener(TimerEvent.TIMER, seekingHandler);
+ setVolume(volume);
+ }
+ public function setFile(src:String):void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "setFile: " + src));
+ if(myStatus.isPlaying) {
+ myChannel.stop();
+ progressUpdates(false);
+ timeUpdates(false);
+ }
+ try {
+ mySound.close();
+ } catch (err:IOError) {
+ // Occurs if the file is either yet to be opened or has finished downloading.
+ }
+ mySound = null;
+ mySound = new Sound();
+ mySound.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
+ mySound.addEventListener(Event.OPEN, loadOpen);
+ mySound.addEventListener(Event.COMPLETE, loadComplete);
+ myRequest = new URLRequest(src);
+ myStatus.reset();
+ myStatus.src = src;
+ myStatus.srcSet = true;
+ timeUpdateEvent();
+ }
+ public function clearFile():void {
+ setFile("");
+ myStatus.srcSet = false;
+ }
+ private function errorHandler(err:IOErrorEvent):void {
+ // MP3 player needs to stop progress and timeupdate events as they are started before the error occurs.
+ // NB: The MP4 player works differently and the error occurs before they are started.
+ progressUpdates(false);
+ timeUpdates(false);
+ myStatus.error(); // Resets status except the src, and it sets srcError property.
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR, myStatus));
+ }
+ private function loadOpen(e:Event):void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "loadOpen:"));
+ myStatus.loading();
+ if(myStatus.playOnLoad) {
+ myStatus.playOnLoad = false; // Capture the flag
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); // So loadstart event happens before play event occurs.
+ play();
+ } else {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus));
+ pause();
+ }
+ progressUpdates(true);
+ }
+ private function loadComplete(e:Event):void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "loadComplete:"));
+ myStatus.loaded();
+ progressUpdates(false);
+ progressEvent();
+ }
+ private function soundCompleteHandler(e:Event):void {
+ myStatus.pausePosition = 0;
+ myStatus.isPlaying = false;
+ timeUpdates(false);
+ timeUpdateEvent();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED, myStatus));
+ }
+ private function progressUpdates(active:Boolean):void {
+ // Using a timer rather than Flash's load progress event, because that event gave data at about 200Hz. The 10Hz timer is closer to HTML5 norm.
+ if(active) {
+ progressTimer.start();
+ } else {
+ progressTimer.stop();
+ }
+ }
+ private function progressHandler(e:TimerEvent):void {
+ progressEvent();
+ }
+ private function progressEvent():void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressEvent:"));
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS, myStatus));
+ }
+ private function timeUpdates(active:Boolean):void {
+ if(active) {
+ timeUpdateTimer.start();
+ } else {
+ timeUpdateTimer.stop();
+ }
+ }
+ private function timeUpdateHandler(e:TimerEvent):void {
+ timeUpdateEvent();
+ }
+ private function timeUpdateEvent():void {
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE, myStatus));
+ }
+ private function seeking(active:Boolean):void {
+ if(active) {
+ if(!myStatus.isSeeking) {
+ seekingEvent();
+ seekingTimer.start();
+ }
+ } else {
+ seekingTimer.stop();
+ }
+ }
+ private function seekingHandler(e:TimerEvent):void {
+ if(myStatus.pausePosition <= getDuration()) {
+ seekedEvent();
+ seeking(false);
+ if(myStatus.playOnSeek) {
+ myStatus.playOnSeek = false; // Capture the flag.
+ play();
+ }
+ } else if(myStatus.isLoaded && (myStatus.pausePosition > getDuration())) {
+ // Illegal seek time
+ seeking(false);
+ seekedEvent();
+ pause(0);
+ }
+ }
+ private function seekingEvent():void {
+ myStatus.isSeeking = true;
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus));
+ }
+ private function seekedEvent():void {
+ myStatus.isSeeking = false;
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus));
+ }
+ public function load():Boolean {
+ if(myStatus.loadRequired()) {
+ myStatus.startingDownload();
+ mySound.load(myRequest, myContext);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function play(time:Number = NaN):Boolean {
+ var wasPlaying:Boolean = myStatus.isPlaying;
+
+ if(!isNaN(time) && myStatus.srcSet) {
+ if(myStatus.isPlaying) {
+ myChannel.stop();
+ myStatus.isPlaying = false;
+ }
+ myStatus.pausePosition = time;
+ }
+
+ if(myStatus.isStartingDownload) {
+ myStatus.playOnLoad = true; // Raise flag, captured in loadOpen()
+ return true;
+ } else if(myStatus.loadRequired()) {
+ myStatus.playOnLoad = true; // Raise flag, captured in loadOpen()
+ return load();
+ } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) {
+ if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end.
+ myStatus.pausePosition = 0;
+ timeUpdates(false);
+ timeUpdateEvent();
+ if(wasPlaying) { // For when playing and then get a play(huge)
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus));
+ }
+ } else if(myStatus.pausePosition > getDuration()) {
+ myStatus.playOnSeek = true;
+ seeking(true);
+ } else {
+ myStatus.isPlaying = true; // Set immediately before playing. Could affects events.
+ myChannel = mySound.play(myStatus.pausePosition);
+ myChannel.soundTransform = myTransform;
+ myChannel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
+ timeUpdates(true);
+ if(!wasPlaying) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus));
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function pause(time:Number = NaN):Boolean {
+ myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before loadOpen() event.
+ myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set.
+
+ var wasPlaying:Boolean = myStatus.isPlaying;
+
+ // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem.
+ var alreadyPausedAtTime:Boolean = false;
+ if(!isNaN(time) && myStatus.pausePosition == time) {
+ alreadyPausedAtTime = true;
+ }
+
+ if(myStatus.isPlaying) {
+ myStatus.isPlaying = false;
+ myChannel.stop();
+ if(myChannel.position > 0) { // Required otherwise a fast play then pause causes myChannel.position to equal zero and not the correct value. ie., When it happens leave pausePosition alone.
+ myStatus.pausePosition = myChannel.position;
+ }
+ }
+
+ if(!isNaN(time) && myStatus.srcSet) {
+ myStatus.pausePosition = time;
+ }
+
+ if(wasPlaying) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus));
+ }
+
+ if(myStatus.isStartingDownload) {
+ return true;
+ } else if(myStatus.loadRequired()) {
+ if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation.
+ return load();
+ } else {
+ return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required.
+ }
+ } else if(myStatus.isLoading || myStatus.isLoaded) {
+ if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end.
+ myStatus.pausePosition = 0;
+ } else if(myStatus.pausePosition > getDuration()) {
+ seeking(true);
+ }
+ timeUpdates(false);
+ // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop.
+ // Neither pause() nor pause(time) will cause a timeupdate loop.
+ if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) {
+ timeUpdateEvent();
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function playHead(percent:Number):Boolean {
+ var time:Number = percent * getDuration() / 100;
+ if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) {
+ return play(time);
+ } else {
+ return pause(time);
+ }
+ }
+ public function setVolume(v:Number):void {
+ myStatus.volume = v;
+ myTransform.volume = v;
+ myChannel.soundTransform = myTransform;
+ }
+ private function updateStatusValues():void {
+ myStatus.seekPercent = 100 * getLoadRatio();
+ myStatus.currentTime = getCurrentTime();
+ myStatus.currentPercentRelative = 100 * getCurrentRatioRel();
+ myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs();
+ myStatus.duration = getDuration();
+ }
+ public function getLoadRatio():Number {
+ if((myStatus.isLoading || myStatus.isLoaded) && mySound.bytesTotal > 0) {
+ return mySound.bytesLoaded / mySound.bytesTotal;
+ } else {
+ return 0;
+ }
+ }
+ public function getDuration():Number {
+ if(mySound.length > 0) {
+ return mySound.length;
+ } else {
+ return 0;
+ }
+ }
+ public function getCurrentTime():Number {
+ if(myStatus.isPlaying) {
+ return myChannel.position;
+ } else {
+ return myStatus.pausePosition;
+ }
+ }
+ public function getCurrentRatioRel():Number {
+ if((getDuration() > 0) && (getCurrentTime() <= getDuration())) {
+ return getCurrentTime() / getDuration();
+ } else {
+ return 0;
+ }
+ }
+ public function getCurrentRatioAbs():Number {
+ return getCurrentRatioRel() * getLoadRatio();
+ }
+ }
+}
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp4.as b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp4.as
new file mode 100644
index 00000000000..dcdc0655d0d
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp4.as
@@ -0,0 +1,413 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Date: 7th August 2011
+ */
+
+package happyworm.jPlayer {
+ import flash.display.Sprite;
+
+ import flash.media.Video;
+ import flash.media.SoundTransform;
+
+ import flash.net.NetConnection;
+ import flash.net.NetStream;
+
+ import flash.utils.Timer;
+
+ import flash.events.NetStatusEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.events.TimerEvent;
+
+ public class JplayerMp4 extends Sprite {
+
+ public var myVideo:Video = new Video();
+ private var myConnection:NetConnection;
+ private var myStream:NetStream;
+
+ private var myTransform:SoundTransform = new SoundTransform();
+
+ public var myStatus:JplayerStatus = new JplayerStatus();
+
+ private var timeUpdateTimer:Timer = new Timer(250, 0); // Matched to HTML event freq
+ private var progressTimer:Timer = new Timer(250, 0); // Matched to HTML event freq
+ private var seekingTimer:Timer = new Timer(100, 0); // Internal: How often seeking is checked to see if it is over.
+
+ public function JplayerMp4(volume:Number) {
+ myConnection = new NetConnection();
+ myConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
+ myConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+ myVideo.smoothing = true;
+ this.addChild(myVideo);
+
+ timeUpdateTimer.addEventListener(TimerEvent.TIMER, timeUpdateHandler);
+ progressTimer.addEventListener(TimerEvent.TIMER, progressHandler);
+ seekingTimer.addEventListener(TimerEvent.TIMER, seekingHandler);
+
+ myStatus.volume = volume;
+ }
+ private function progressUpdates(active:Boolean):void {
+ if(active) {
+ progressTimer.start();
+ } else {
+ progressTimer.stop();
+ }
+ }
+ private function progressHandler(e:TimerEvent):void {
+ if(myStatus.isLoading) {
+ if(getLoadRatio() == 1) { // Close as can get to a loadComplete event since client.onPlayStatus only works with FMS
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressHandler: loadComplete"));
+ myStatus.loaded();
+ progressUpdates(false);
+ }
+ }
+ progressEvent();
+ }
+ private function progressEvent():void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressEvent:"));
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS, myStatus));
+ }
+ private function timeUpdates(active:Boolean):void {
+ if(active) {
+ timeUpdateTimer.start();
+ } else {
+ timeUpdateTimer.stop();
+ }
+ }
+ private function timeUpdateHandler(e:TimerEvent):void {
+ timeUpdateEvent();
+ }
+ private function timeUpdateEvent():void {
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE, myStatus));
+ }
+ private function seeking(active:Boolean):void {
+ if(active) {
+ if(!myStatus.isSeeking) {
+ seekingEvent();
+ }
+ seekingTimer.start();
+ } else {
+ if(myStatus.isSeeking) {
+ seekedEvent();
+ }
+ seekingTimer.stop();
+ }
+ }
+ private function seekingHandler(e:TimerEvent):void {
+ if(getSeekTimeRatio() <= getLoadRatio()) {
+ seeking(false);
+ if(myStatus.playOnSeek) {
+ myStatus.playOnSeek = false; // Capture the flag.
+ play(myStatus.pausePosition); // Must pass time or the seek time is never set.
+ } else {
+ pause(myStatus.pausePosition); // Must pass time or the stream.time is read.
+ }
+ } else if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) {
+ // Illegal seek time
+ seeking(false);
+ pause(0);
+ }
+ }
+ private function seekingEvent():void {
+ myStatus.isSeeking = true;
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus));
+ }
+ private function seekedEvent():void {
+ myStatus.isSeeking = false;
+ updateStatusValues();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus));
+ }
+ private function netStatusHandler(e:NetStatusEvent):void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "netStatusHandler: '" + e.info.code + "'"));
+ switch(e.info.code) {
+ case "NetConnection.Connect.Success":
+ connectStream();
+ break;
+ case "NetStream.Play.Start":
+ // This event code occurs once, when the media is opened. Equiv to loadOpen() in mp3 player.
+ myStatus.loading();
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus));
+ progressUpdates(true);
+ // See onMetaDataHandler() for other condition, since duration is vital.
+ break;
+ case "NetStream.Play.Stop":
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "NetStream.Play.Stop: getDuration() - getCurrentTime() = " + (getDuration() - getCurrentTime())));
+
+ // Check if media is at the end (or close) otherwise this was due to download bandwidth stopping playback. ie., Download is not fast enough.
+ if(Math.abs(getDuration() - getCurrentTime()) < 150) { // Testing found 150ms worked best for M4A files, where playHead(99.9) caused a stuck state due to firing with ~116ms left to play.
+ endedEvent();
+ }
+ break;
+ case "NetStream.Seek.InvalidTime":
+ // Used for capturing invalid set times and clicks on the end of the progress bar.
+ endedEvent();
+ break;
+ case "NetStream.Play.StreamNotFound":
+ myStatus.error(); // Resets status except the src, and it sets srcError property.
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR, myStatus));
+ break;
+ }
+ // "NetStream.Seek.Notify" event code is not very useful. It occurs after every seek(t) command issued and does not appear to wait for the media to be ready.
+ }
+ private function endedEvent():void {
+ var wasPlaying:Boolean = myStatus.isPlaying;
+ pause(0);
+ timeUpdates(false);
+ timeUpdateEvent();
+ if(wasPlaying) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED, myStatus));
+ }
+ }
+ private function securityErrorHandler(event:SecurityErrorEvent):void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "securityErrorHandler."));
+ }
+ private function connectStream():void {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "connectStream."));
+ var customClient:Object = new Object();
+ customClient.onMetaData = onMetaDataHandler;
+ // customClient.onPlayStatus = onPlayStatusHandler; // According to the forums and my tests, onPlayStatus only works with FMS (Flash Media Server).
+ myStream = null;
+ myStream = new NetStream(myConnection);
+ myStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
+ myStream.client = customClient;
+ myVideo.attachNetStream(myStream);
+ setVolume(myStatus.volume);
+ myStream.play(myStatus.src);
+ }
+ public function setFile(src:String):void {
+ if(myStream != null) {
+ myStream.close();
+ }
+ myVideo.clear();
+ progressUpdates(false);
+ timeUpdates(false);
+
+ myStatus.reset();
+ myStatus.src = src;
+ myStatus.srcSet = true;
+ timeUpdateEvent();
+ }
+ public function clearFile():void {
+ setFile("");
+ myStatus.srcSet = false;
+ }
+ public function load():Boolean {
+ if(myStatus.loadRequired()) {
+ myStatus.startingDownload();
+ myConnection.connect(null);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function play(time:Number = NaN):Boolean {
+ var wasPlaying:Boolean = myStatus.isPlaying;
+
+ if(!isNaN(time) && myStatus.srcSet) {
+ if(myStatus.isPlaying) {
+ myStream.pause();
+ myStatus.isPlaying = false;
+ }
+ myStatus.pausePosition = time;
+ }
+
+ if(myStatus.isStartingDownload) {
+ myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler()
+ return true;
+ } else if(myStatus.loadRequired()) {
+ myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler()
+ return load();
+ } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) {
+ if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end.
+ myStream.pause(); // Since it is playing by default at this point.
+ myStatus.pausePosition = 0;
+ myStream.seek(0);
+ timeUpdates(false);
+ timeUpdateEvent();
+ if(wasPlaying) { // For when playing and then get a play(huge)
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus));
+ }
+ } else if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount
+ myStatus.playOnSeek = true;
+ seeking(true);
+ myStream.pause(); // Since it is playing by default at this point.
+ } else {
+ if(!isNaN(time)) { // Avoid using seek() when it is already correct.
+ myStream.seek(myStatus.pausePosition/1000); // Since time is in ms and seek() takes seconds
+ }
+ myStatus.isPlaying = true; // Set immediately before playing. Could affects events.
+ myStream.resume();
+ timeUpdates(true);
+ if(!wasPlaying) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus));
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function pause(time:Number = NaN):Boolean {
+ myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before onMetadata() event.
+ myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set.
+
+ var wasPlaying:Boolean = myStatus.isPlaying;
+
+ // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem.
+ var alreadyPausedAtTime:Boolean = false;
+ if(!isNaN(time) && myStatus.pausePosition == time) {
+ alreadyPausedAtTime = true;
+ }
+
+ // Need to wait for metadata to load before ever issuing a pause. The metadata handler will call this function if needed, when ready.
+ if(myStream != null && myStatus.metaDataReady) { // myStream is a null until the 1st media is loaded. ie., The 1st ever setMedia being followed by a pause() or pause(t).
+ myStream.pause();
+ }
+ if(myStatus.isPlaying) {
+ myStatus.isPlaying = false;
+ myStatus.pausePosition = myStream.time * 1000;
+ }
+
+ if(!isNaN(time) && myStatus.srcSet) {
+ myStatus.pausePosition = time;
+ }
+
+ if(wasPlaying) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus));
+ }
+
+ if(myStatus.isStartingDownload) {
+ return true;
+ } else if(myStatus.loadRequired()) {
+ if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation.
+ return load();
+ } else {
+ return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required.
+ }
+ } else if(myStatus.isLoading || myStatus.isLoaded) {
+ if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end.
+ myStatus.pausePosition = 0;
+ myStream.seek(0);
+ seekedEvent(); // Deals with seeking effect when using setMedia() then pause(huge). NB: There is no preceeding seeking event.
+ } else if(!isNaN(time)) {
+ if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount
+ seeking(true);
+ } else {
+ if(myStatus.metaDataReady) { // Otherwise seek(0) will stop the metadata loading.
+ myStream.seek(myStatus.pausePosition/1000);
+ }
+ }
+ }
+ timeUpdates(false);
+ // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop.
+ // Neither pause() nor pause(time) will cause a timeupdate loop.
+ if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) {
+ timeUpdateEvent();
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function playHead(percent:Number):Boolean {
+ var time:Number = percent * getDuration() * getLoadRatio() / 100;
+ if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) {
+ return play(time);
+ } else {
+ return pause(time);
+ }
+ }
+ public function setVolume(v:Number):void {
+ myStatus.volume = v;
+ myTransform.volume = v;
+ if(myStream != null) {
+ myStream.soundTransform = myTransform;
+ }
+ }
+ private function updateStatusValues():void {
+ myStatus.seekPercent = 100 * getLoadRatio();
+ myStatus.currentTime = getCurrentTime();
+ myStatus.currentPercentRelative = 100 * getCurrentRatioRel();
+ myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs();
+ myStatus.duration = getDuration();
+ }
+ public function getLoadRatio():Number {
+ if((myStatus.isLoading || myStatus.isLoaded) && myStream.bytesTotal > 0) {
+ return myStream.bytesLoaded / myStream.bytesTotal;
+ } else {
+ return 0;
+ }
+ }
+ public function getDuration():Number {
+ return myStatus.duration; // Set from meta data.
+ }
+ public function getCurrentTime():Number {
+ if(myStatus.isPlaying) {
+ return myStream.time * 1000;
+ } else {
+ return myStatus.pausePosition;
+ }
+ }
+ public function getCurrentRatioRel():Number {
+ if((getLoadRatio() > 0) && (getCurrentRatioAbs() <= getLoadRatio())) {
+ return getCurrentRatioAbs() / getLoadRatio();
+ } else {
+ return 0;
+ }
+ }
+ public function getCurrentRatioAbs():Number {
+ if(getDuration() > 0) {
+ return getCurrentTime() / getDuration();
+ } else {
+ return 0;
+ }
+ }
+ public function getSeekTimeRatio():Number {
+ if(getDuration() > 0) {
+ return myStatus.pausePosition / getDuration();
+ } else {
+ return 1;
+ }
+ }
+ public function onMetaDataHandler(info:Object):void { // Used in connectStream() in myStream.client object.
+ // This event occurs when jumping to the start of static files! ie., seek(0) will cause this event to occur.
+ if(!myStatus.metaDataReady) {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: " + info.duration + " | " + info.width + "x" + info.height));
+
+ myStatus.metaDataReady = true; // Set flag so that this event only effects jPlayer the 1st time.
+ myStatus.metaData = info;
+ myStatus.duration = info.duration * 1000; // Only available via Meta Data.
+ if(info.width != undefined) {
+ myVideo.width = info.width;
+ }
+ if(info.height != undefined) {
+ myVideo.height = info.height;
+ }
+
+ if(myStatus.playOnLoad) {
+ myStatus.playOnLoad = false; // Capture the flag
+ if(myStatus.pausePosition > 0 ) { // Important for setMedia followed by play(time).
+ play(myStatus.pausePosition);
+ } else {
+ play(); // Not always sending pausePosition avoids the extra seek(0) for a normal play() command.
+ }
+ } else {
+ pause(myStatus.pausePosition); // Always send the pausePosition. Important for setMedia() followed by pause(time). Deals with not reading stream.time with setMedia() and play() immediately followed by stop() or pause(0)
+ }
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADEDMETADATA, myStatus));
+ } else {
+ this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: Already read (NO EFFECT)"));
+ }
+ }
+ }
+}
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerStatus.as b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerStatus.as
new file mode 100644
index 00000000000..5cc1e1ff4b3
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerStatus.as
@@ -0,0 +1,101 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.happyworm.com/jquery/jplayer
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Date: 1st September 2011
+ */
+
+package happyworm.jPlayer {
+ public class JplayerStatus {
+
+ public static const VERSION:String = "2.1.0"; // The version of the Flash jPlayer entity.
+
+ public var volume:Number = 0.5; // Not affected by reset()
+ public var muted:Boolean = false; // Not affected by reset()
+
+ public var src:String;
+ public var srcError:Boolean;
+
+ public var srcSet:Boolean;
+ public var isPlaying:Boolean;
+ public var isSeeking:Boolean;
+
+ public var playOnLoad:Boolean;
+ public var playOnSeek:Boolean;
+
+ public var isStartingDownload:Boolean;
+ public var isLoading:Boolean;
+ public var isLoaded:Boolean;
+
+ public var pausePosition:Number;
+
+ public var seekPercent:Number;
+ public var currentTime:Number;
+ public var currentPercentRelative:Number;
+ public var currentPercentAbsolute:Number;
+ public var duration:Number;
+
+ public var metaDataReady:Boolean;
+ public var metaData:Object;
+
+ public function JplayerStatus() {
+ reset();
+ }
+ public function reset():void {
+ src = "";
+ srcError = false;
+
+ srcSet = false;
+ isPlaying = false;
+ isSeeking = false;
+
+ playOnLoad = false;
+ playOnSeek = false;
+
+ isStartingDownload = false;
+ isLoading = false;
+ isLoaded = false;
+
+ pausePosition = 0;
+
+ seekPercent = 0;
+ currentTime = 0;
+ currentPercentRelative = 0;
+ currentPercentAbsolute = 0;
+ duration = 0;
+
+ metaDataReady = false;
+ metaData = {};
+ }
+ public function error():void {
+ var srcSaved:String = src;
+ reset();
+ src = srcSaved;
+ srcError = true;
+ }
+ public function loadRequired():Boolean {
+ return (srcSet && !isStartingDownload && !isLoading && !isLoaded);
+ }
+ public function startingDownload():void {
+ isStartingDownload = true;
+ isLoading = false;
+ isLoaded = false;
+ }
+ public function loading():void {
+ isStartingDownload = false;
+ isLoading = true;
+ isLoaded = false;
+ }
+ public function loaded():void {
+ isStartingDownload = false;
+ isLoading = false;
+ isLoaded = true;
+ }
+ }
+}
diff --git a/apps/media/js/jQuery.jPlayer.2.1.0.source/jquery.jplayer.js b/apps/media/js/jQuery.jPlayer.2.1.0.source/jquery.jplayer.js
new file mode 100644
index 00000000000..9d41a12ee6c
--- /dev/null
+++ b/apps/media/js/jQuery.jPlayer.2.1.0.source/jquery.jplayer.js
@@ -0,0 +1,2349 @@
+/*
+ * jPlayer Plugin for jQuery JavaScript Library
+ * http://www.jplayer.org
+ *
+ * Copyright (c) 2009 - 2011 Happyworm Ltd
+ * Dual licensed under the MIT and GPL licenses.
+ * - http://www.opensource.org/licenses/mit-license.php
+ * - http://www.gnu.org/copyleft/gpl.html
+ *
+ * Author: Mark J Panaghiston
+ * Version: 2.1.0
+ * Date: 1st September 2011
+ */
+
+/* Code verified using http://www.jshint.com/ */
+/*jshint asi:false, bitwise:false, boss:false, browser:true, curly:true, debug:false, eqeqeq:true, eqnull:false, evil:false, forin:false, immed:false, jquery:true, laxbreak:false, newcap:true, noarg:true, noempty:true, nonew:true, nomem:false, onevar:false, passfail:false, plusplus:false, regexp:false, undef:true, sub:false, strict:false, white:false */
+/*global jQuery:false, ActiveXObject:false, alert:false */
+
+(function($, undefined) {
+
+ // Adapted from jquery.ui.widget.js (1.8.7): $.widget.bridge
+ $.fn.jPlayer = function( options ) {
+ var name = "jPlayer";
+ var isMethodCall = typeof options === "string",
+ args = Array.prototype.slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.extend.apply( null, [ true, options ].concat(args) ) :
+ options;
+
+ // prevent calls to internal methods
+ if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+ return returnValue;
+ }
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var instance = $.data( this, name ),
+ methodValue = instance && $.isFunction( instance[options] ) ?
+ instance[ options ].apply( instance, args ) :
+ instance;
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, name );
+ if ( instance ) {
+ // instance.option( options || {} )._init(); // Orig jquery.ui.widget.js code: Not recommend for jPlayer. ie., Applying new options to an existing instance (via the jPlayer constructor) and performing the _init(). The _init() is what concerns me. It would leave a lot of event handlers acting on jPlayer instance and the interface.
+ instance.option( options || {} ); // The new constructor only changes the options. Changing options only has basic support atm.
+ } else {
+ $.data( this, name, new $.jPlayer( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+
+ $.jPlayer = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this.element = $(element);
+ this.options = $.extend(true, {},
+ this.options,
+ options
+ );
+ var self = this;
+ this.element.bind( "remove.jPlayer", function() {
+ self.destroy();
+ });
+ this._init();
+ }
+ };
+ // End of: (Adapted from jquery.ui.widget.js (1.8.7))
+
+ // Emulated HTML5 methods and properties
+ $.jPlayer.emulateMethods = "load play pause";
+ $.jPlayer.emulateStatus = "src readyState networkState currentTime duration paused ended playbackRate";
+ $.jPlayer.emulateOptions = "muted volume";
+
+ // Reserved event names generated by jPlayer that are not part of the HTML5 Media element spec
+ $.jPlayer.reservedEvent = "ready flashreset resize repeat error warning";
+
+ // Events generated by jPlayer
+ $.jPlayer.event = {
+ ready: "jPlayer_ready",
+ flashreset: "jPlayer_flashreset", // Similar to the ready event if the Flash solution is set to display:none and then shown again or if it's reloaded for another reason by the browser. For example, using CSS position:fixed on Firefox for the full screen feature.
+ resize: "jPlayer_resize", // Occurs when the size changes through a full/restore screen operation or if the size/sizeFull options are changed.
+ repeat: "jPlayer_repeat", // Occurs when the repeat status changes. Usually through clicks on the repeat button of the interface.
+ click: "jPlayer_click", // Occurs when the user clicks on one of the following: poster image, html video, flash video.
+ error: "jPlayer_error", // Event error code in event.jPlayer.error.type. See $.jPlayer.error
+ warning: "jPlayer_warning", // Event warning code in event.jPlayer.warning.type. See $.jPlayer.warning
+
+ // Other events match HTML5 spec.
+ loadstart: "jPlayer_loadstart",
+ progress: "jPlayer_progress",
+ suspend: "jPlayer_suspend",
+ abort: "jPlayer_abort",
+ emptied: "jPlayer_emptied",
+ stalled: "jPlayer_stalled",
+ play: "jPlayer_play",
+ pause: "jPlayer_pause",
+ loadedmetadata: "jPlayer_loadedmetadata",
+ loadeddata: "jPlayer_loadeddata",
+ waiting: "jPlayer_waiting",
+ playing: "jPlayer_playing",
+ canplay: "jPlayer_canplay",
+ canplaythrough: "jPlayer_canplaythrough",
+ seeking: "jPlayer_seeking",
+ seeked: "jPlayer_seeked",
+ timeupdate: "jPlayer_timeupdate",
+ ended: "jPlayer_ended",
+ ratechange: "jPlayer_ratechange",
+ durationchange: "jPlayer_durationchange",
+ volumechange: "jPlayer_volumechange"
+ };
+
+ $.jPlayer.htmlEvent = [ // These HTML events are bubbled through to the jPlayer event, without any internal action.
+ "loadstart",
+ // "progress", // jPlayer uses internally before bubbling.
+ // "suspend", // jPlayer uses internally before bubbling.
+ "abort",
+ // "error", // jPlayer uses internally before bubbling.
+ "emptied",
+ "stalled",
+ // "play", // jPlayer uses internally before bubbling.
+ // "pause", // jPlayer uses internally before bubbling.
+ "loadedmetadata",
+ "loadeddata",
+ // "waiting", // jPlayer uses internally before bubbling.
+ // "playing", // jPlayer uses internally before bubbling.
+ "canplay",
+ "canplaythrough",
+ // "seeking", // jPlayer uses internally before bubbling.
+ // "seeked", // jPlayer uses internally before bubbling.
+ // "timeupdate", // jPlayer uses internally before bubbling.
+ // "ended", // jPlayer uses internally before bubbling.
+ "ratechange"
+ // "durationchange" // jPlayer uses internally before bubbling.
+ // "volumechange" // jPlayer uses internally before bubbling.
+ ];
+
+ $.jPlayer.pause = function() {
+ $.each($.jPlayer.prototype.instances, function(i, element) {
+ if(element.data("jPlayer").status.srcSet) { // Check that media is set otherwise would cause error event.
+ element.jPlayer("pause");
+ }
+ });
+ };
+
+ $.jPlayer.timeFormat = {
+ showHour: false,
+ showMin: true,
+ showSec: true,
+ padHour: false,
+ padMin: true,
+ padSec: true,
+ sepHour: ":",
+ sepMin: ":",
+ sepSec: ""
+ };
+
+ $.jPlayer.convertTime = function(s) {
+ var myTime = new Date(s * 1000);
+ var hour = myTime.getUTCHours();
+ var min = myTime.getUTCMinutes();
+ var sec = myTime.getUTCSeconds();
+ var strHour = ($.jPlayer.timeFormat.padHour && hour < 10) ? "0" + hour : hour;
+ var strMin = ($.jPlayer.timeFormat.padMin && min < 10) ? "0" + min : min;
+ var strSec = ($.jPlayer.timeFormat.padSec && sec < 10) ? "0" + sec : sec;
+ return (($.jPlayer.timeFormat.showHour) ? strHour + $.jPlayer.timeFormat.sepHour : "") + (($.jPlayer.timeFormat.showMin) ? strMin + $.jPlayer.timeFormat.sepMin : "") + (($.jPlayer.timeFormat.showSec) ? strSec + $.jPlayer.timeFormat.sepSec : "");
+ };
+
+ // Adapting jQuery 1.4.4 code for jQuery.browser. Required since jQuery 1.3.2 does not detect Chrome as webkit.
+ $.jPlayer.uaBrowser = function( userAgent ) {
+ var ua = userAgent.toLowerCase();
+
+ // Useragent RegExp
+ var rwebkit = /(webkit)[ \/]([\w.]+)/;
+ var ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/;
+ var rmsie = /(msie) ([\w.]+)/;
+ var rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/;
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ };
+
+ // Platform sniffer for detecting mobile devices
+ $.jPlayer.uaPlatform = function( userAgent ) {
+ var ua = userAgent.toLowerCase();
+
+ // Useragent RegExp
+ var rplatform = /(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/;
+ var rtablet = /(ipad|playbook)/;
+ var randroid = /(android)/;
+ var rmobile = /(mobile)/;
+
+ var platform = rplatform.exec( ua ) || [];
+ var tablet = rtablet.exec( ua ) ||
+ !rmobile.exec( ua ) && randroid.exec( ua ) ||
+ [];
+
+ if(platform[1]) {
+ platform[1] = platform[1].replace(/\s/g, "_"); // Change whitespace to underscore. Enables dot notation.
+ }
+
+ return { platform: platform[1] || "", tablet: tablet[1] || "" };
+ };
+
+ $.jPlayer.browser = {
+ };
+ $.jPlayer.platform = {
+ };
+
+ var browserMatch = $.jPlayer.uaBrowser(navigator.userAgent);
+ if ( browserMatch.browser ) {
+ $.jPlayer.browser[ browserMatch.browser ] = true;
+ $.jPlayer.browser.version = browserMatch.version;
+ }
+ var platformMatch = $.jPlayer.uaPlatform(navigator.userAgent);
+ if ( platformMatch.platform ) {
+ $.jPlayer.platform[ platformMatch.platform ] = true;
+ $.jPlayer.platform.mobile = !platformMatch.tablet;
+ $.jPlayer.platform.tablet = !!platformMatch.tablet;
+ }
+
+ $.jPlayer.prototype = {
+ count: 0, // Static Variable: Change it via prototype.
+ version: { // Static Object
+ script: "2.1.0",
+ needFlash: "2.1.0",
+ flash: "unknown"
+ },
+ options: { // Instanced in $.jPlayer() constructor
+ swfPath: "js", // Path to Jplayer.swf. Can be relative, absolute or server root relative.
+ solution: "html, flash", // Valid solutions: html, flash. Order defines priority. 1st is highest,
+ supplied: "mp3", // Defines which formats jPlayer will try and support and the priority by the order. 1st is highest,
+ preload: 'metadata', // HTML5 Spec values: none, metadata, auto.
+ volume: 0.8, // The volume. Number 0 to 1.
+ muted: false,
+ wmode: "opaque", // Valid wmode: window, transparent, opaque, direct, gpu.
+ backgroundColor: "#000000", // To define the jPlayer div and Flash background color.
+ cssSelectorAncestor: "#jp_container_1",
+ cssSelector: { // * denotes properties that should only be required when video media type required. _cssSelector() would require changes to enable splitting these into Audio and Video defaults.
+ videoPlay: ".jp-video-play", // *
+ play: ".jp-play",
+ pause: ".jp-pause",
+ stop: ".jp-stop",
+ seekBar: ".jp-seek-bar",
+ playBar: ".jp-play-bar",
+ mute: ".jp-mute",
+ unmute: ".jp-unmute",
+ volumeBar: ".jp-volume-bar",
+ volumeBarValue: ".jp-volume-bar-value",
+ volumeMax: ".jp-volume-max",
+ currentTime: ".jp-current-time",
+ duration: ".jp-duration",
+ fullScreen: ".jp-full-screen", // *
+ restoreScreen: ".jp-restore-screen", // *
+ repeat: ".jp-repeat",
+ repeatOff: ".jp-repeat-off",
+ gui: ".jp-gui", // The interface used with autohide feature.
+ noSolution: ".jp-no-solution" // For error feedback when jPlayer cannot find a solution.
+ },
+ fullScreen: false,
+ autohide: {
+ restored: false, // Controls the interface autohide feature.
+ full: true, // Controls the interface autohide feature.
+ fadeIn: 200, // Milliseconds. The period of the fadeIn anim.
+ fadeOut: 600, // Milliseconds. The period of the fadeOut anim.
+ hold: 1000 // Milliseconds. The period of the pause before autohide beings.
+ },
+ loop: false,
+ repeat: function(event) { // The default jPlayer repeat event handler
+ if(event.jPlayer.options.loop) {
+ $(this).unbind(".jPlayerRepeat").bind($.jPlayer.event.ended + ".jPlayer.jPlayerRepeat", function() {
+ $(this).jPlayer("play");
+ });
+ } else {
+ $(this).unbind(".jPlayerRepeat");
+ }
+ },
+ nativeVideoControls: {
+ // Works well on standard browsers.
+ // Phone and tablet browsers can have problems with the controls disappearing.
+ },
+ noFullScreen: {
+ msie: /msie [0-6]/,
+ ipad: /ipad.*?os [0-4]/,
+ iphone: /iphone/,
+ ipod: /ipod/,
+ android_pad: /android [0-3](?!.*?mobile)/,
+ android_phone: /android.*?mobile/,
+ blackberry: /blackberry/,
+ windows_ce: /windows ce/,
+ webos: /webos/
+ },
+ noVolume: {
+ ipad: /ipad/,
+ iphone: /iphone/,
+ ipod: /ipod/,
+ android_pad: /android(?!.*?mobile)/,
+ android_phone: /android.*?mobile/,
+ blackberry: /blackberry/,
+ windows_ce: /windows ce/,
+ webos: /webos/,
+ playbook: /playbook/
+ },
+ verticalVolume: false, // Calculate volume from the bottom of the volume bar. Default is from the left. Also volume affects either width or height.
+ // globalVolume: false, // Not implemented: Set to make volume changes affect all jPlayer instances
+ // globalMute: false, // Not implemented: Set to make mute changes affect all jPlayer instances
+ idPrefix: "jp", // Prefix for the ids of html elements created by jPlayer. For flash, this must not include characters: . - + * / \
+ noConflict: "jQuery",
+ emulateHtml: false, // Emulates the HTML5 Media element on the jPlayer element.
+ errorAlerts: false,
+ warningAlerts: false
+ },
+ optionsAudio: {
+ size: {
+ width: "0px",
+ height: "0px",
+ cssClass: ""
+ },
+ sizeFull: {
+ width: "0px",
+ height: "0px",
+ cssClass: ""
+ }
+ },
+ optionsVideo: {
+ size: {
+ width: "480px",
+ height: "270px",
+ cssClass: "jp-video-270p"
+ },
+ sizeFull: {
+ width: "100%",
+ height: "100%",
+ cssClass: "jp-video-full"
+ }
+ },
+ instances: {}, // Static Object
+ status: { // Instanced in _init()
+ src: "",
+ media: {},
+ paused: true,
+ format: {},
+ formatType: "",
+ waitForPlay: true, // Same as waitForLoad except in case where preloading.
+ waitForLoad: true,
+ srcSet: false,
+ video: false, // True if playing a video
+ seekPercent: 0,
+ currentPercentRelative: 0,
+ currentPercentAbsolute: 0,
+ currentTime: 0,
+ duration: 0,
+ readyState: 0,
+ networkState: 0,
+ playbackRate: 1,
+ ended: 0
+
+/* Persistant status properties created dynamically at _init():
+ width
+ height
+ cssClass
+ nativeVideoControls
+ noFullScreen
+ noVolume
+*/
+ },
+
+ internal: { // Instanced in _init()
+ ready: false
+ // instance: undefined
+ // domNode: undefined
+ // htmlDlyCmdId: undefined
+ // autohideId: undefined
+ },
+ solution: { // Static Object: Defines the solutions built in jPlayer.
+ html: true,
+ flash: true
+ },
+ // 'MPEG-4 support' : canPlayType('video/mp4; codecs="mp4v.20.8"')
+ format: { // Static Object
+ mp3: {
+ codec: 'audio/mpeg; codecs="mp3"',
+ flashCanPlay: true,
+ media: 'audio'
+ },
+ m4a: { // AAC / MP4
+ codec: 'audio/mp4; codecs="mp4a.40.2"',
+ flashCanPlay: true,
+ media: 'audio'
+ },
+ oga: { // OGG
+ codec: 'audio/ogg; codecs="vorbis"',
+ flashCanPlay: false,
+ media: 'audio'
+ },
+ wav: { // PCM
+ codec: 'audio/wav; codecs="1"',
+ flashCanPlay: false,
+ media: 'audio'
+ },
+ webma: { // WEBM
+ codec: 'audio/webm; codecs="vorbis"',
+ flashCanPlay: false,
+ media: 'audio'
+ },
+ fla: { // FLV / F4A
+ codec: 'audio/x-flv',
+ flashCanPlay: true,
+ media: 'audio'
+ },
+ m4v: { // H.264 / MP4
+ codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
+ flashCanPlay: true,
+ media: 'video'
+ },
+ ogv: { // OGG
+ codec: 'video/ogg; codecs="theora, vorbis"',
+ flashCanPlay: false,
+ media: 'video'
+ },
+ webmv: { // WEBM
+ codec: 'video/webm; codecs="vorbis, vp8"',
+ flashCanPlay: false,
+ media: 'video'
+ },
+ flv: { // FLV / F4V
+ codec: 'video/x-flv',
+ flashCanPlay: true,
+ media: 'video'
+ }
+ },
+ _init: function() {
+ var self = this;
+
+ this.element.empty();
+
+ this.status = $.extend({}, this.status); // Copy static to unique instance.
+ this.internal = $.extend({}, this.internal); // Copy static to unique instance.
+
+ this.internal.domNode = this.element.get(0);
+
+ this.formats = []; // Array based on supplied string option. Order defines priority.
+ this.solutions = []; // Array based on solution string option. Order defines priority.
+ this.require = {}; // Which media types are required: video, audio.
+
+ this.htmlElement = {}; // DOM elements created by jPlayer
+ this.html = {}; // In _init()'s this.desired code and setmedia(): Accessed via this[solution], where solution from this.solutions array.
+ this.html.audio = {};
+ this.html.video = {};
+ this.flash = {}; // In _init()'s this.desired code and setmedia(): Accessed via this[solution], where solution from this.solutions array.
+
+ this.css = {};
+ this.css.cs = {}; // Holds the css selector strings
+ this.css.jq = {}; // Holds jQuery selectors. ie., $(css.cs.method)
+
+ this.ancestorJq = []; // Holds jQuery selector of cssSelectorAncestor. Init would use $() instead of [], but it is only 1.4+
+
+ this.options.volume = this._limitValue(this.options.volume, 0, 1); // Limit volume value's bounds.
+
+ // Create the formats array, with prority based on the order of the supplied formats string
+ $.each(this.options.supplied.toLowerCase().split(","), function(index1, value1) {
+ var format = value1.replace(/^\s+|\s+$/g, ""); //trim
+ if(self.format[format]) { // Check format is valid.
+ var dupFound = false;
+ $.each(self.formats, function(index2, value2) { // Check for duplicates
+ if(format === value2) {
+ dupFound = true;
+ return false;
+ }
+ });
+ if(!dupFound) {
+ self.formats.push(format);
+ }
+ }
+ });
+
+ // Create the solutions array, with prority based on the order of the solution string
+ $.each(this.options.solution.toLowerCase().split(","), function(index1, value1) {
+ var solution = value1.replace(/^\s+|\s+$/g, ""); //trim
+ if(self.solution[solution]) { // Check solution is valid.
+ var dupFound = false;
+ $.each(self.solutions, function(index2, value2) { // Check for duplicates
+ if(solution === value2) {
+ dupFound = true;
+ return false;
+ }
+ });
+ if(!dupFound) {
+ self.solutions.push(solution);
+ }
+ }
+ });
+
+ this.internal.instance = "jp_" + this.count;
+ this.instances[this.internal.instance] = this.element;
+
+ // Check the jPlayer div has an id and create one if required. Important for Flash to know the unique id for comms.
+ if(!this.element.attr("id")) {
+ this.element.attr("id", this.options.idPrefix + "_jplayer_" + this.count);
+ }
+
+ this.internal.self = $.extend({}, {
+ id: this.element.attr("id"),
+ jq: this.element
+ });
+ this.internal.audio = $.extend({}, {
+ id: this.options.idPrefix + "_audio_" + this.count,
+ jq: undefined
+ });
+ this.internal.video = $.extend({}, {
+ id: this.options.idPrefix + "_video_" + this.count,
+ jq: undefined
+ });
+ this.internal.flash = $.extend({}, {
+ id: this.options.idPrefix + "_flash_" + this.count,
+ jq: undefined,
+ swf: this.options.swfPath + (this.options.swfPath.toLowerCase().slice(-4) !== ".swf" ? (this.options.swfPath && this.options.swfPath.slice(-1) !== "/" ? "/" : "") + "Jplayer.swf" : "")
+ });
+ this.internal.poster = $.extend({}, {
+ id: this.options.idPrefix + "_poster_" + this.count,
+ jq: undefined
+ });
+
+ // Register listeners defined in the constructor
+ $.each($.jPlayer.event, function(eventName,eventType) {
+ if(self.options[eventName] !== undefined) {
+ self.element.bind(eventType + ".jPlayer", self.options[eventName]); // With .jPlayer namespace.
+ self.options[eventName] = undefined; // Destroy the handler pointer copy on the options. Reason, events can be added/removed in other ways so this could be obsolete and misleading.
+ }
+ });
+
+ // Determine if we require solutions for audio, video or both media types.
+ this.require.audio = false;
+ this.require.video = false;
+ $.each(this.formats, function(priority, format) {
+ self.require[self.format[format].media] = true;
+ });
+
+ // Now required types are known, finish the options default settings.
+ if(this.require.video) {
+ this.options = $.extend(true, {},
+ this.optionsVideo,
+ this.options
+ );
+ } else {
+ this.options = $.extend(true, {},
+ this.optionsAudio,
+ this.options
+ );
+ }
+ this._setSize(); // update status and jPlayer element size
+
+ // Determine the status for Blocklisted options.
+ this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls);
+ this.status.noFullScreen = this._uaBlocklist(this.options.noFullScreen);
+ this.status.noVolume = this._uaBlocklist(this.options.noVolume);
+
+ // The native controls are only for video and are disabled when audio is also used.
+ this._restrictNativeVideoControls();
+
+ // Create the poster image.
+ this.htmlElement.poster = document.createElement('img');
+ this.htmlElement.poster.id = this.internal.poster.id;
+ this.htmlElement.poster.onload = function() { // Note that this did not work on Firefox 3.6: poster.addEventListener("onload", function() {}, false); Did not investigate x-browser.
+ if(!self.status.video || self.status.waitForPlay) {
+ self.internal.poster.jq.show();
+ }
+ };
+ this.element.append(this.htmlElement.poster);
+ this.internal.poster.jq = $("#" + this.internal.poster.id);
+ this.internal.poster.jq.css({'width': this.status.width, 'height': this.status.height});
+ this.internal.poster.jq.hide();
+ this.internal.poster.jq.bind("click.jPlayer", function() {
+ self._trigger($.jPlayer.event.click);
+ });
+
+ // Generate the required media elements
+ this.html.audio.available = false;
+ if(this.require.audio) { // If a supplied format is audio
+ this.htmlElement.audio = document.createElement('audio');
+ this.htmlElement.audio.id = this.internal.audio.id;
+ this.html.audio.available = !!this.htmlElement.audio.canPlayType && this._testCanPlayType(this.htmlElement.audio); // Test is for IE9 on Win Server 2008.
+ }
+ this.html.video.available = false;
+ if(this.require.video) { // If a supplied format is video
+ this.htmlElement.video = document.createElement('video');
+ this.htmlElement.video.id = this.internal.video.id;
+ this.html.video.available = !!this.htmlElement.video.canPlayType && this._testCanPlayType(this.htmlElement.video); // Test is for IE9 on Win Server 2008.
+ }
+
+ this.flash.available = this._checkForFlash(10);
+
+ this.html.canPlay = {};
+ this.flash.canPlay = {};
+ $.each(this.formats, function(priority, format) {
+ self.html.canPlay[format] = self.html[self.format[format].media].available && "" !== self.htmlElement[self.format[format].media].canPlayType(self.format[format].codec);
+ self.flash.canPlay[format] = self.format[format].flashCanPlay && self.flash.available;
+ });
+ this.html.desired = false;
+ this.flash.desired = false;
+ $.each(this.solutions, function(solutionPriority, solution) {
+ if(solutionPriority === 0) {
+ self[solution].desired = true;
+ } else {
+ var audioCanPlay = false;
+ var videoCanPlay = false;
+ $.each(self.formats, function(formatPriority, format) {
+ if(self[self.solutions[0]].canPlay[format]) { // The other solution can play
+ if(self.format[format].media === 'video') {
+ videoCanPlay = true;
+ } else {
+ audioCanPlay = true;
+ }
+ }
+ });
+ self[solution].desired = (self.require.audio && !audioCanPlay) || (self.require.video && !videoCanPlay);
+ }
+ });
+ // This is what jPlayer will support, based on solution and supplied.
+ this.html.support = {};
+ this.flash.support = {};
+ $.each(this.formats, function(priority, format) {
+ self.html.support[format] = self.html.canPlay[format] && self.html.desired;
+ self.flash.support[format] = self.flash.canPlay[format] && self.flash.desired;
+ });
+ // If jPlayer is supporting any format in a solution, then the solution is used.
+ this.html.used = false;
+ this.flash.used = false;
+ $.each(this.solutions, function(solutionPriority, solution) {
+ $.each(self.formats, function(formatPriority, format) {
+ if(self[solution].support[format]) {
+ self[solution].used = true;
+ return false;
+ }
+ });
+ });
+
+ // Init solution active state and the event gates to false.
+ this._resetActive();
+ this._resetGate();
+
+ // Set up the css selectors for the control and feedback entities.
+ this._cssSelectorAncestor(this.options.cssSelectorAncestor);
+
+ // If neither html nor flash are being used by this browser, then media playback is not possible. Trigger an error event.
+ if(!(this.html.used || this.flash.used)) {
+ this._error( {
+ type: $.jPlayer.error.NO_SOLUTION,
+ context: "{solution:'" + this.options.solution + "', supplied:'" + this.options.supplied + "'}",
+ message: $.jPlayer.errorMsg.NO_SOLUTION,
+ hint: $.jPlayer.errorHint.NO_SOLUTION
+ });
+ if(this.css.jq.noSolution.length) {
+ this.css.jq.noSolution.show();
+ }
+ } else {
+ if(this.css.jq.noSolution.length) {
+ this.css.jq.noSolution.hide();
+ }
+ }
+
+ // Add the flash solution if it is being used.
+ if(this.flash.used) {
+ var htmlObj,
+ flashVars = 'jQuery=' + encodeURI(this.options.noConflict) + '&id=' + encodeURI(this.internal.self.id) + '&vol=' + this.options.volume + '&muted=' + this.options.muted;
+
+ // Code influenced by SWFObject 2.2: http://code.google.com/p/swfobject/
+ // Non IE browsers have an initial Flash size of 1 by 1 otherwise the wmode affected the Flash ready event.
+
+ if($.browser.msie && Number($.browser.version) <= 8) {
+ var objStr = '<object id="' + this.internal.flash.id + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="0" height="0"></object>';
+
+ var paramStr = [
+ '<param name="movie" value="' + this.internal.flash.swf + '" />',
+ '<param name="FlashVars" value="' + flashVars + '" />',
+ '<param name="allowScriptAccess" value="always" />',
+ '<param name="bgcolor" value="' + this.options.backgroundColor + '" />',
+ '<param name="wmode" value="' + this.options.wmode + '" />'
+ ];
+
+ htmlObj = document.createElement(objStr);
+ for(var i=0; i < paramStr.length; i++) {
+ htmlObj.appendChild(document.createElement(paramStr[i]));
+ }
+ } else {
+ var createParam = function(el, n, v) {
+ var p = document.createElement("param");
+ p.setAttribute("name", n);
+ p.setAttribute("value", v);
+ el.appendChild(p);
+ };
+
+ htmlObj = document.createElement("object");
+ htmlObj.setAttribute("id", this.internal.flash.id);
+ htmlObj.setAttribute("data", this.internal.flash.swf);
+ htmlObj.setAttribute("type", "application/x-shockwave-flash");
+ htmlObj.setAttribute("width", "1"); // Non-zero
+ htmlObj.setAttribute("height", "1"); // Non-zero
+ createParam(htmlObj, "flashvars", flashVars);
+ createParam(htmlObj, "allowscriptaccess", "always");
+ createParam(htmlObj, "bgcolor", this.options.backgroundColor);
+ createParam(htmlObj, "wmode", this.options.wmode);
+ }
+
+ this.element.append(htmlObj);
+ this.internal.flash.jq = $(htmlObj);
+ }
+
+ // Add the HTML solution if being used.
+ if(this.html.used) {
+
+ // The HTML Audio handlers
+ if(this.html.audio.available) {
+ this._addHtmlEventListeners(this.htmlElement.audio, this.html.audio);
+ this.element.append(this.htmlElement.audio);
+ this.internal.audio.jq = $("#" + this.internal.audio.id);
+ }
+
+ // The HTML Video handlers
+ if(this.html.video.available) {
+ this._addHtmlEventListeners(this.htmlElement.video, this.html.video);
+ this.element.append(this.htmlElement.video);
+ this.internal.video.jq = $("#" + this.internal.video.id);
+ if(this.status.nativeVideoControls) {
+ this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height});
+ } else {
+ this.internal.video.jq.css({'width':'0px', 'height':'0px'}); // Using size 0x0 since a .hide() causes issues in iOS
+ }
+ this.internal.video.jq.bind("click.jPlayer", function() {
+ self._trigger($.jPlayer.event.click);
+ });
+ }
+ }
+
+ // Create the bridge that emulates the HTML Media element on the jPlayer DIV
+ if( this.options.emulateHtml ) {
+ this._emulateHtmlBridge();
+ }
+
+ if(this.html.used && !this.flash.used) { // If only HTML, then emulate flash ready() call after 100ms.
+ setTimeout( function() {
+ self.internal.ready = true;
+ self.version.flash = "n/a";
+ self._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option.
+ self._trigger($.jPlayer.event.ready);
+ }, 100);
+ }
+
+ // Initialize the interface components with the options.
+ this._updateNativeVideoControls(); // Must do this first, otherwise there is a bizarre bug in iOS 4.3.2, where the native controls are not shown. Fails in iOS if called after _updateButtons() below. Works if called later in setMedia too, so it odd.
+ this._updateInterface();
+ this._updateButtons(false);
+ this._updateAutohide();
+ this._updateVolume(this.options.volume);
+ this._updateMute(this.options.muted);
+ if(this.css.jq.videoPlay.length) {
+ this.css.jq.videoPlay.hide();
+ }
+
+ $.jPlayer.prototype.count++; // Change static variable via prototype.
+ },
+ destroy: function() {
+ // MJP: The background change remains. Would need to store the original to restore it correctly.
+ // MJP: The jPlayer element's size change remains.
+
+ // Clear the media to reset the GUI and stop any downloads. Streams on some browsers had persited. (Chrome)
+ this.clearMedia();
+ // Remove the size/sizeFull cssClass from the cssSelectorAncestor
+ this._removeUiClass();
+ // Remove the times from the GUI
+ if(this.css.jq.currentTime.length) {
+ this.css.jq.currentTime.text("");
+ }
+ if(this.css.jq.duration.length) {
+ this.css.jq.duration.text("");
+ }
+ // Remove any bindings from the interface controls.
+ $.each(this.css.jq, function(fn, jq) {
+ // Check selector is valid before trying to execute method.
+ if(jq.length) {
+ jq.unbind(".jPlayer");
+ }
+ });
+ // Remove the click handlers for $.jPlayer.event.click
+ this.internal.poster.jq.unbind(".jPlayer");
+ if(this.internal.video.jq) {
+ this.internal.video.jq.unbind(".jPlayer");
+ }
+ // Destroy the HTML bridge.
+ if(this.options.emulateHtml) {
+ this._destroyHtmlBridge();
+ }
+ this.element.removeData("jPlayer"); // Remove jPlayer data
+ this.element.unbind(".jPlayer"); // Remove all event handlers created by the jPlayer constructor
+ this.element.empty(); // Remove the inserted child elements
+
+ delete this.instances[this.internal.instance]; // Clear the instance on the static instance object
+ },
+ enable: function() { // Plan to implement
+ // options.disabled = false
+ },
+ disable: function () { // Plan to implement
+ // options.disabled = true
+ },
+ _testCanPlayType: function(elem) {
+ // IE9 on Win Server 2008 did not implement canPlayType(), but it has the property.
+ try {
+ elem.canPlayType(this.format.mp3.codec); // The type is irrelevant.
+ return true;
+ } catch(err) {
+ return false;
+ }
+ },
+ _uaBlocklist: function(list) {
+ // list : object with properties that are all regular expressions. Property names are irrelevant.
+ // Returns true if the user agent is matched in list.
+ var ua = navigator.userAgent.toLowerCase(),
+ block = false;
+
+ $.each(list, function(p, re) {
+ if(re && re.test(ua)) {
+ block = true;
+ return false; // exit $.each.
+ }
+ });
+ return block;
+ },
+ _restrictNativeVideoControls: function() {
+ // Fallback to noFullScreen when nativeVideoControls is true and audio media is being used. Affects when both media types are used.
+ if(this.require.audio) {
+ if(this.status.nativeVideoControls) {
+ this.status.nativeVideoControls = false;
+ this.status.noFullScreen = true;
+ }
+ }
+ },
+ _updateNativeVideoControls: function() {
+ if(this.html.video.available && this.html.used) {
+ // Turn the HTML Video controls on/off
+ this.htmlElement.video.controls = this.status.nativeVideoControls;
+ // Show/hide the jPlayer GUI.
+ this._updateAutohide();
+ // For when option changed. The poster image is not updated, as it is dealt with in setMedia(). Acceptable degradation since seriously doubt these options will change on the fly. Can again review later.
+ if(this.status.nativeVideoControls && this.require.video) {
+ this.internal.poster.jq.hide();
+ this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height});
+ } else if(this.status.waitForPlay && this.status.video) {
+ this.internal.poster.jq.show();
+ this.internal.video.jq.css({'width': '0px', 'height': '0px'});
+ }
+ }
+ },
+ _addHtmlEventListeners: function(mediaElement, entity) {
+ var self = this;
+ mediaElement.preload = this.options.preload;
+ mediaElement.muted = this.options.muted;
+ mediaElement.volume = this.options.volume;
+
+ // Create the event listeners
+ // Only want the active entity to affect jPlayer and bubble events.
+ // Using entity.gate so that object is referenced and gate property always current
+
+ mediaElement.addEventListener("progress", function() {
+ if(entity.gate) {
+ self._getHtmlStatus(mediaElement);
+ self._updateInterface();
+ self._trigger($.jPlayer.event.progress);
+ }
+ }, false);
+ mediaElement.addEventListener("timeupdate", function() {
+ if(entity.gate) {
+ self._getHtmlStatus(mediaElement);
+ self._updateInterface();
+ self._trigger($.jPlayer.event.timeupdate);
+ }
+ }, false);
+ mediaElement.addEventListener("durationchange", function() {
+ if(entity.gate) {
+ self.status.duration = this.duration;
+ self._getHtmlStatus(mediaElement);
+ self._updateInterface();
+ self._trigger($.jPlayer.event.durationchange);
+ }
+ }, false);
+ mediaElement.addEventListener("play", function() {
+ if(entity.gate) {
+ self._updateButtons(true);
+ self._html_checkWaitForPlay(); // So the native controls update this variable and puts the hidden interface in the correct state. Affects toggling native controls.
+ self._trigger($.jPlayer.event.play);
+ }
+ }, false);
+ mediaElement.addEventListener("playing", function() {
+ if(entity.gate) {
+ self._updateButtons(true);
+ self._seeked();
+ self._trigger($.jPlayer.event.playing);
+ }
+ }, false);
+ mediaElement.addEventListener("pause", function() {
+ if(entity.gate) {
+ self._updateButtons(false);
+ self._trigger($.jPlayer.event.pause);
+ }
+ }, false);
+ mediaElement.addEventListener("waiting", function() {
+ if(entity.gate) {
+ self._seeking();
+ self._trigger($.jPlayer.event.waiting);
+ }
+ }, false);
+ mediaElement.addEventListener("seeking", function() {
+ if(entity.gate) {
+ self._seeking();
+ self._trigger($.jPlayer.event.seeking);
+ }
+ }, false);
+ mediaElement.addEventListener("seeked", function() {
+ if(entity.gate) {
+ self._seeked();
+ self._trigger($.jPlayer.event.seeked);
+ }
+ }, false);
+ mediaElement.addEventListener("volumechange", function() {
+ if(entity.gate) {
+ // Read the values back from the element as the Blackberry PlayBook shares the volume with the physical buttons master volume control.
+ // However, when tested 6th July 2011, those buttons do not generate an event. The physical play/pause button does though.
+ self.options.volume = mediaElement.volume;
+ self.options.muted = mediaElement.muted;
+ self._updateMute();
+ self._updateVolume();
+ self._trigger($.jPlayer.event.volumechange);
+ }
+ }, false);
+ mediaElement.addEventListener("suspend", function() { // Seems to be the only way of capturing that the iOS4 browser did not actually play the media from the page code. ie., It needs a user gesture.
+ if(entity.gate) {
+ self._seeked();
+ self._trigger($.jPlayer.event.suspend);
+ }
+ }, false);
+ mediaElement.addEventListener("ended", function() {
+ if(entity.gate) {
+ // Order of the next few commands are important. Change the time and then pause.
+ // Solves a bug in Firefox, where issuing pause 1st causes the media to play from the start. ie., The pause is ignored.
+ if(!$.jPlayer.browser.webkit) { // Chrome crashes if you do this in conjunction with a setMedia command in an ended event handler. ie., The playlist demo.
+ self.htmlElement.media.currentTime = 0; // Safari does not care about this command. ie., It works with or without this line. (Both Safari and Chrome are Webkit.)
+ }
+ self.htmlElement.media.pause(); // Pause otherwise a click on the progress bar will play from that point, when it shouldn't, since it stopped playback.
+ self._updateButtons(false);
+ self._getHtmlStatus(mediaElement, true); // With override true. Otherwise Chrome leaves progress at full.
+ self._updateInterface();
+ self._trigger($.jPlayer.event.ended);
+ }
+ }, false);
+ mediaElement.addEventListener("error", function() {
+ if(entity.gate) {
+ self._updateButtons(false);
+ self._seeked();
+ if(self.status.srcSet) { // Deals with case of clearMedia() causing an error event.
+ clearTimeout(self.internal.htmlDlyCmdId); // Clears any delayed commands used in the HTML solution.
+ self.status.waitForLoad = true; // Allows the load operation to try again.
+ self.status.waitForPlay = true; // Reset since a play was captured.
+ if(self.status.video && !self.status.nativeVideoControls) {
+ self.internal.video.jq.css({'width':'0px', 'height':'0px'});
+ }
+ if(self._validString(self.status.media.poster) && !self.status.nativeVideoControls) {
+ self.internal.poster.jq.show();
+ }
+ if(self.css.jq.videoPlay.length) {
+ self.css.jq.videoPlay.show();
+ }
+ self._error( {
+ type: $.jPlayer.error.URL,
+ context: self.status.src, // this.src shows absolute urls. Want context to show the url given.
+ message: $.jPlayer.errorMsg.URL,
+ hint: $.jPlayer.errorHint.URL
+ });
+ }
+ }
+ }, false);
+ // Create all the other event listeners that bubble up to a jPlayer event from html, without being used by jPlayer.
+ $.each($.jPlayer.htmlEvent, function(i, eventType) {
+ mediaElement.addEventListener(this, function() {
+ if(entity.gate) {
+ self._trigger($.jPlayer.event[eventType]);
+ }
+ }, false);
+ });
+ },
+ _getHtmlStatus: function(media, override) {
+ var ct = 0, d = 0, cpa = 0, sp = 0, cpr = 0;
+
+ if(media.duration) { // Fixes the duration bug in iOS, where the durationchange event occurs when media.duration is not always correct.
+ this.status.duration = media.duration;
+ }
+ ct = media.currentTime;
+ cpa = (this.status.duration > 0) ? 100 * ct / this.status.duration : 0;
+ if((typeof media.seekable === "object") && (media.seekable.length > 0)) {
+ sp = (this.status.duration > 0) ? 100 * media.seekable.end(media.seekable.length-1) / this.status.duration : 100;
+ cpr = 100 * media.currentTime / media.seekable.end(media.seekable.length-1);
+ } else {
+ sp = 100;
+ cpr = cpa;
+ }
+
+ if(override) {
+ ct = 0;
+ cpr = 0;
+ cpa = 0;
+ }
+
+ this.status.seekPercent = sp;
+ this.status.currentPercentRelative = cpr;
+ this.status.currentPercentAbsolute = cpa;
+ this.status.currentTime = ct;
+
+ this.status.readyState = media.readyState;
+ this.status.networkState = media.networkState;
+ this.status.playbackRate = media.playbackRate;
+ this.status.ended = media.ended;
+ },
+ _resetStatus: function() {
+ this.status = $.extend({}, this.status, $.jPlayer.prototype.status); // Maintains the status properties that persist through a reset.
+ },
+ _trigger: function(eventType, error, warning) { // eventType always valid as called using $.jPlayer.event.eventType
+ var event = $.Event(eventType);
+ event.jPlayer = {};
+ event.jPlayer.version = $.extend({}, this.version);
+ event.jPlayer.options = $.extend(true, {}, this.options); // Deep copy
+ event.jPlayer.status = $.extend(true, {}, this.status); // Deep copy
+ event.jPlayer.html = $.extend(true, {}, this.html); // Deep copy
+ event.jPlayer.flash = $.extend(true, {}, this.flash); // Deep copy
+ if(error) {
+ event.jPlayer.error = $.extend({}, error);
+ }
+ if(warning) {
+ event.jPlayer.warning = $.extend({}, warning);
+ }
+ this.element.trigger(event);
+ },
+ jPlayerFlashEvent: function(eventType, status) { // Called from Flash
+ if(eventType === $.jPlayer.event.ready) {
+ if(!this.internal.ready) {
+ this.internal.ready = true;
+ this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Once Flash generates the ready event, minimise to zero as it is not affected by wmode anymore.
+
+ this.version.flash = status.version;
+ if(this.version.needFlash !== this.version.flash) {
+ this._error( {
+ type: $.jPlayer.error.VERSION,
+ context: this.version.flash,
+ message: $.jPlayer.errorMsg.VERSION + this.version.flash,
+ hint: $.jPlayer.errorHint.VERSION
+ });
+ }
+ this._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option.
+ this._trigger(eventType);
+ } else {
+ // This condition occurs if the Flash is hidden and then shown again.
+ // Firefox also reloads the Flash if the CSS position changes. position:fixed is used for full screen.
+
+ // Only do this if the Flash is the solution being used at the moment. Affects Media players where both solution may be being used.
+ if(this.flash.gate) {
+
+ // Send the current status to the Flash now that it is ready (available) again.
+ if(this.status.srcSet) {
+
+ // Need to read original status before issuing the setMedia command.
+ var currentTime = this.status.currentTime,
+ paused = this.status.paused;
+
+ this.setMedia(this.status.media);
+ if(currentTime > 0) {
+ if(paused) {
+ this.pause(currentTime);
+ } else {
+ this.play(currentTime);
+ }
+ }
+ }
+ this._trigger($.jPlayer.event.flashreset);
+ }
+ }
+ }
+ if(this.flash.gate) {
+ switch(eventType) {
+ case $.jPlayer.event.progress:
+ this._getFlashStatus(status);
+ this._updateInterface();
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.timeupdate:
+ this._getFlashStatus(status);
+ this._updateInterface();
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.play:
+ this._seeked();
+ this._updateButtons(true);
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.pause:
+ this._updateButtons(false);
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.ended:
+ this._updateButtons(false);
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.click:
+ this._trigger(eventType); // This could be dealt with by the default
+ break;
+ case $.jPlayer.event.error:
+ this.status.waitForLoad = true; // Allows the load operation to try again.
+ this.status.waitForPlay = true; // Reset since a play was captured.
+ if(this.status.video) {
+ this.internal.flash.jq.css({'width':'0px', 'height':'0px'});
+ }
+ if(this._validString(this.status.media.poster)) {
+ this.internal.poster.jq.show();
+ }
+ if(this.css.jq.videoPlay.length && this.status.video) {
+ this.css.jq.videoPlay.show();
+ }
+ if(this.status.video) { // Set up for another try. Execute before error event.
+ this._flash_setVideo(this.status.media);
+ } else {
+ this._flash_setAudio(this.status.media);
+ }
+ this._updateButtons(false);
+ this._error( {
+ type: $.jPlayer.error.URL,
+ context:status.src,
+ message: $.jPlayer.errorMsg.URL,
+ hint: $.jPlayer.errorHint.URL
+ });
+ break;
+ case $.jPlayer.event.seeking:
+ this._seeking();
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.seeked:
+ this._seeked();
+ this._trigger(eventType);
+ break;
+ case $.jPlayer.event.ready:
+ // The ready event is handled outside the switch statement.
+ // Captured here otherwise 2 ready events would be generated if the ready event handler used setMedia.
+ break;
+ default:
+ this._trigger(eventType);
+ }
+ }
+ return false;
+ },
+ _getFlashStatus: function(status) {
+ this.status.seekPercent = status.seekPercent;
+ this.status.currentPercentRelative = status.currentPercentRelative;
+ this.status.currentPercentAbsolute = status.currentPercentAbsolute;
+ this.status.currentTime = status.currentTime;
+ this.status.duration = status.duration;
+
+ // The Flash does not generate this information in this release
+ this.status.readyState = 4; // status.readyState;
+ this.status.networkState = 0; // status.networkState;
+ this.status.playbackRate = 1; // status.playbackRate;
+ this.status.ended = false; // status.ended;
+ },
+ _updateButtons: function(playing) {
+ if(playing !== undefined) {
+ this.status.paused = !playing;
+ if(this.css.jq.play.length && this.css.jq.pause.length) {
+ if(playing) {
+ this.css.jq.play.hide();
+ this.css.jq.pause.show();
+ } else {
+ this.css.jq.play.show();
+ this.css.jq.pause.hide();
+ }
+ }
+ }
+ if(this.css.jq.restoreScreen.length && this.css.jq.fullScreen.length) {
+ if(this.status.noFullScreen) {
+ this.css.jq.fullScreen.hide();
+ this.css.jq.restoreScreen.hide();
+ } else if(this.options.fullScreen) {
+ this.css.jq.fullScreen.hide();
+ this.css.jq.restoreScreen.show();
+ } else {
+ this.css.jq.fullScreen.show();
+ this.css.jq.restoreScreen.hide();
+ }
+ }
+ if(this.css.jq.repeat.length && this.css.jq.repeatOff.length) {
+ if(this.options.loop) {
+ this.css.jq.repeat.hide();
+ this.css.jq.repeatOff.show();
+ } else {
+ this.css.jq.repeat.show();
+ this.css.jq.repeatOff.hide();
+ }
+ }
+ },
+ _updateInterface: function() {
+ if(this.css.jq.seekBar.length) {
+ this.css.jq.seekBar.width(this.status.seekPercent+"%");
+ }
+ if(this.css.jq.playBar.length) {
+ this.css.jq.playBar.width(this.status.currentPercentRelative+"%");
+ }
+ if(this.css.jq.currentTime.length) {
+ this.css.jq.currentTime.text($.jPlayer.convertTime(this.status.currentTime));
+ }
+ if(this.css.jq.duration.length) {
+ this.css.jq.duration.text($.jPlayer.convertTime(this.status.duration));
+ }
+ },
+ _seeking: function() {
+ if(this.css.jq.seekBar.length) {
+ this.css.jq.seekBar.addClass("jp-seeking-bg");
+ }
+ },
+ _seeked: function() {
+ if(this.css.jq.seekBar.length) {
+ this.css.jq.seekBar.removeClass("jp-seeking-bg");
+ }
+ },
+ _resetGate: function() {
+ this.html.audio.gate = false;
+ this.html.video.gate = false;
+ this.flash.gate = false;
+ },
+ _resetActive: function() {
+ this.html.active = false;
+ this.flash.active = false;
+ },
+ setMedia: function(media) {
+
+ /* media[format] = String: URL of format. Must contain all of the supplied option's video or audio formats.
+ * media.poster = String: Video poster URL.
+ * media.subtitles = String: * NOT IMPLEMENTED * URL of subtitles SRT file
+ * media.chapters = String: * NOT IMPLEMENTED * URL of chapters SRT file
+ * media.stream = Boolean: * NOT IMPLEMENTED * Designating actual media streams. ie., "false/undefined" for files. Plan to refresh the flash every so often.
+ */
+
+ var self = this,
+ supported = false,
+ posterChanged = this.status.media.poster !== media.poster; // Compare before reset. Important for OSX Safari as this.htmlElement.poster.src is absolute, even if original poster URL was relative.
+
+ this._resetMedia();
+ this._resetGate();
+ this._resetActive();
+
+ $.each(this.formats, function(formatPriority, format) {
+ var isVideo = self.format[format].media === 'video';
+ $.each(self.solutions, function(solutionPriority, solution) {
+ if(self[solution].support[format] && self._validString(media[format])) { // Format supported in solution and url given for format.
+ var isHtml = solution === 'html';
+
+ if(isVideo) {
+ if(isHtml) {
+ self.html.video.gate = true;
+ self._html_setVideo(media);
+ self.html.active = true;
+ } else {
+ self.flash.gate = true;
+ self._flash_setVideo(media);
+ self.flash.active = true;
+ }
+ if(self.css.jq.videoPlay.length) {
+ self.css.jq.videoPlay.show();
+ }
+ self.status.video = true;
+ } else {
+ if(isHtml) {
+ self.html.audio.gate = true;
+ self._html_setAudio(media);
+ self.html.active = true;
+ } else {
+ self.flash.gate = true;
+ self._flash_setAudio(media);
+ self.flash.active = true;
+ }
+ if(self.css.jq.videoPlay.length) {
+ self.css.jq.videoPlay.hide();
+ }
+ self.status.video = false;
+ }
+
+ supported = true;
+ return false; // Exit $.each
+ }
+ });
+ if(supported) {
+ return false; // Exit $.each
+ }
+ });
+
+ if(supported) {
+ if(!(this.status.nativeVideoControls && this.html.video.gate)) {
+ // Set poster IMG if native video controls are not being used
+ // Note: With IE the IMG onload event occurs immediately when cached.
+ // Note: Poster hidden by default in _resetMedia()
+ if(this._validString(media.poster)) {
+ if(posterChanged) { // Since some browsers do not generate img onload event.
+ this.htmlElement.poster.src = media.poster;
+ } else {
+ this.internal.poster.jq.show();
+ }
+ }
+ }
+ this.status.srcSet = true;
+ this.status.media = $.extend({}, media);
+ this._updateButtons(false);
+ this._updateInterface();
+ } else { // jPlayer cannot support any formats provided in this browser
+ // Send an error event
+ this._error( {
+ type: $.jPlayer.error.NO_SUPPORT,
+ context: "{supplied:'" + this.options.supplied + "'}",
+ message: $.jPlayer.errorMsg.NO_SUPPORT,
+ hint: $.jPlayer.errorHint.NO_SUPPORT
+ });
+ }
+ },
+ _resetMedia: function() {
+ this._resetStatus();
+ this._updateButtons(false);
+ this._updateInterface();
+ this._seeked();
+ this.internal.poster.jq.hide();
+
+ clearTimeout(this.internal.htmlDlyCmdId);
+
+ if(this.html.active) {
+ this._html_resetMedia();
+ } else if(this.flash.active) {
+ this._flash_resetMedia();
+ }
+ },
+ clearMedia: function() {
+ this._resetMedia();
+
+ if(this.html.active) {
+ this._html_clearMedia();
+ } else if(this.flash.active) {
+ this._flash_clearMedia();
+ }
+
+ this._resetGate();
+ this._resetActive();
+ },
+ load: function() {
+ if(this.status.srcSet) {
+ if(this.html.active) {
+ this._html_load();
+ } else if(this.flash.active) {
+ this._flash_load();
+ }
+ } else {
+ this._urlNotSetError("load");
+ }
+ },
+ play: function(time) {
+ time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler
+ if(this.status.srcSet) {
+ if(this.html.active) {
+ this._html_play(time);
+ } else if(this.flash.active) {
+ this._flash_play(time);
+ }
+ } else {
+ this._urlNotSetError("play");
+ }
+ },
+ videoPlay: function(e) { // Handles clicks on the play button over the video poster
+ this.play();
+ },
+ pause: function(time) {
+ time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler
+ if(this.status.srcSet) {
+ if(this.html.active) {
+ this._html_pause(time);
+ } else if(this.flash.active) {
+ this._flash_pause(time);
+ }
+ } else {
+ this._urlNotSetError("pause");
+ }
+ },
+ pauseOthers: function() {
+ var self = this;
+ $.each(this.instances, function(i, element) {
+ if(self.element !== element) { // Do not this instance.
+ if(element.data("jPlayer").status.srcSet) { // Check that media is set otherwise would cause error event.
+ element.jPlayer("pause");
+ }
+ }
+ });
+ },
+ stop: function() {
+ if(this.status.srcSet) {
+ if(this.html.active) {
+ this._html_pause(0);
+ } else if(this.flash.active) {
+ this._flash_pause(0);
+ }
+ } else {
+ this._urlNotSetError("stop");
+ }
+ },
+ playHead: function(p) {
+ p = this._limitValue(p, 0, 100);
+ if(this.status.srcSet) {
+ if(this.html.active) {
+ this._html_playHead(p);
+ } else if(this.flash.active) {
+ this._flash_playHead(p);
+ }
+ } else {
+ this._urlNotSetError("playHead");
+ }
+ },
+ _muted: function(muted) {
+ this.options.muted = muted;
+ if(this.html.used) {
+ this._html_mute(muted);
+ }
+ if(this.flash.used) {
+ this._flash_mute(muted);
+ }
+
+ // The HTML solution generates this event from the media element itself.
+ if(!this.html.video.gate && !this.html.audio.gate) {
+ this._updateMute(muted);
+ this._updateVolume(this.options.volume);
+ this._trigger($.jPlayer.event.volumechange);
+ }
+ },
+ mute: function(mute) { // mute is either: undefined (true), an event object (true) or a boolean (muted).
+ mute = mute === undefined ? true : !!mute;
+ this._muted(mute);
+ },
+ unmute: function(unmute) { // unmute is either: undefined (true), an event object (true) or a boolean (!muted).
+ unmute = unmute === undefined ? true : !!unmute;
+ this._muted(!unmute);
+ },
+ _updateMute: function(mute) {
+ if(mute === undefined) {
+ mute = this.options.muted;
+ }
+ if(this.css.jq.mute.length && this.css.jq.unmute.length) {
+ if(this.status.noVolume) {
+ this.css.jq.mute.hide();
+ this.css.jq.unmute.hide();
+ } else if(mute) {
+ this.css.jq.mute.hide();
+ this.css.jq.unmute.show();
+ } else {
+ this.css.jq.mute.show();
+ this.css.jq.unmute.hide();
+ }
+ }
+ },
+ volume: function(v) {
+ v = this._limitValue(v, 0, 1);
+ this.options.volume = v;
+
+ if(this.html.used) {
+ this._html_volume(v);
+ }
+ if(this.flash.used) {
+ this._flash_volume(v);
+ }
+
+ // The HTML solution generates this event from the media element itself.
+ if(!this.html.video.gate && !this.html.audio.gate) {
+ this._updateVolume(v);
+ this._trigger($.jPlayer.event.volumechange);
+ }
+ },
+ volumeBar: function(e) { // Handles clicks on the volumeBar
+ if(this.css.jq.volumeBar.length) {
+ var offset = this.css.jq.volumeBar.offset(),
+ x = e.pageX - offset.left,
+ w = this.css.jq.volumeBar.width(),
+ y = this.css.jq.volumeBar.height() - e.pageY + offset.top,
+ h = this.css.jq.volumeBar.height();
+
+ if(this.options.verticalVolume) {
+ this.volume(y/h);
+ } else {
+ this.volume(x/w);
+ }
+ }
+ if(this.options.muted) {
+ this._muted(false);
+ }
+ },
+ volumeBarValue: function(e) { // Handles clicks on the volumeBarValue
+ this.volumeBar(e);
+ },
+ _updateVolume: function(v) {
+ if(v === undefined) {
+ v = this.options.volume;
+ }
+ v = this.options.muted ? 0 : v;
+
+ if(this.status.noVolume) {
+ if(this.css.jq.volumeBar.length) {
+ this.css.jq.volumeBar.hide();
+ }
+ if(this.css.jq.volumeBarValue.length) {
+ this.css.jq.volumeBarValue.hide();
+ }
+ if(this.css.jq.volumeMax.length) {
+ this.css.jq.volumeMax.hide();
+ }
+ } else {
+ if(this.css.jq.volumeBar.length) {
+ this.css.jq.volumeBar.show();
+ }
+ if(this.css.jq.volumeBarValue.length) {
+ this.css.jq.volumeBarValue.show();
+ this.css.jq.volumeBarValue[this.options.verticalVolume ? "height" : "width"]((v*100)+"%");
+ }
+ if(this.css.jq.volumeMax.length) {
+ this.css.jq.volumeMax.show();
+ }
+ }
+ },
+ volumeMax: function() { // Handles clicks on the volume max
+ this.volume(1);
+ if(this.options.muted) {
+ this._muted(false);
+ }
+ },
+ _cssSelectorAncestor: function(ancestor) {
+ var self = this;
+ this.options.cssSelectorAncestor = ancestor;
+ this._removeUiClass();
+ this.ancestorJq = ancestor ? $(ancestor) : []; // Would use $() instead of [], but it is only 1.4+
+ if(ancestor && this.ancestorJq.length !== 1) { // So empty strings do not generate the warning.
+ this._warning( {
+ type: $.jPlayer.warning.CSS_SELECTOR_COUNT,
+ context: ancestor,
+ message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.ancestorJq.length + " found for cssSelectorAncestor.",
+ hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT
+ });
+ }
+ this._addUiClass();
+ $.each(this.options.cssSelector, function(fn, cssSel) {
+ self._cssSelector(fn, cssSel);
+ });
+ },
+ _cssSelector: function(fn, cssSel) {
+ var self = this;
+ if(typeof cssSel === 'string') {
+ if($.jPlayer.prototype.options.cssSelector[fn]) {
+ if(this.css.jq[fn] && this.css.jq[fn].length) {
+ this.css.jq[fn].unbind(".jPlayer");
+ }
+ this.options.cssSelector[fn] = cssSel;
+ this.css.cs[fn] = this.options.cssSelectorAncestor + " " + cssSel;
+
+ if(cssSel) { // Checks for empty string
+ this.css.jq[fn] = $(this.css.cs[fn]);
+ } else {
+ this.css.jq[fn] = []; // To comply with the css.jq[fn].length check before its use. As of jQuery 1.4 could have used $() for an empty set.
+ }
+
+ if(this.css.jq[fn].length) {
+ var handler = function(e) {
+ self[fn](e);
+ $(this).blur();
+ return false;
+ };
+ this.css.jq[fn].bind("click.jPlayer", handler); // Using jPlayer namespace
+ }
+
+ if(cssSel && this.css.jq[fn].length !== 1) { // So empty strings do not generate the warning. ie., they just remove the old one.
+ this._warning( {
+ type: $.jPlayer.warning.CSS_SELECTOR_COUNT,
+ context: this.css.cs[fn],
+ message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.css.jq[fn].length + " found for " + fn + " method.",
+ hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT
+ });
+ }
+ } else {
+ this._warning( {
+ type: $.jPlayer.warning.CSS_SELECTOR_METHOD,
+ context: fn,
+ message: $.jPlayer.warningMsg.CSS_SELECTOR_METHOD,
+ hint: $.jPlayer.warningHint.CSS_SELECTOR_METHOD
+ });
+ }
+ } else {
+ this._warning( {
+ type: $.jPlayer.warning.CSS_SELECTOR_STRING,
+ context: cssSel,
+ message: $.jPlayer.warningMsg.CSS_SELECTOR_STRING,
+ hint: $.jPlayer.warningHint.CSS_SELECTOR_STRING
+ });
+ }
+ },
+ seekBar: function(e) { // Handles clicks on the seekBar
+ if(this.css.jq.seekBar) {
+ var offset = this.css.jq.seekBar.offset();
+ var x = e.pageX - offset.left;
+ var w = this.css.jq.seekBar.width();
+ var p = 100*x/w;
+ this.playHead(p);
+ }
+ },
+ playBar: function(e) { // Handles clicks on the playBar
+ this.seekBar(e);
+ },
+ repeat: function() { // Handle clicks on the repeat button
+ this._loop(true);
+ },
+ repeatOff: function() { // Handle clicks on the repeatOff button
+ this._loop(false);
+ },
+ _loop: function(loop) {
+ if(this.options.loop !== loop) {
+ this.options.loop = loop;
+ this._updateButtons();
+ this._trigger($.jPlayer.event.repeat);
+ }
+ },
+
+ // Plan to review the cssSelector method to cope with missing associated functions accordingly.
+
+ currentTime: function(e) { // Handles clicks on the text
+ // Added to avoid errors using cssSelector system for the text
+ },
+ duration: function(e) { // Handles clicks on the text
+ // Added to avoid errors using cssSelector system for the text
+ },
+ gui: function(e) { // Handles clicks on the gui
+ // Added to avoid errors using cssSelector system for the gui
+ },
+ noSolution: function(e) { // Handles clicks on the error message
+ // Added to avoid errors using cssSelector system for no-solution
+ },
+
+ // Options code adapted from ui.widget.js (1.8.7). Made changes so the key can use dot notation. To match previous getData solution in jPlayer 1.
+ option: function(key, value) {
+ var options = key;
+
+ // Enables use: options(). Returns a copy of options object
+ if ( arguments.length === 0 ) {
+ return $.extend( true, {}, this.options );
+ }
+
+ if(typeof key === "string") {
+ var keys = key.split(".");
+
+ // Enables use: options("someOption") Returns a copy of the option. Supports dot notation.
+ if(value === undefined) {
+
+ var opt = $.extend(true, {}, this.options);
+ for(var i = 0; i < keys.length; i++) {
+ if(opt[keys[i]] !== undefined) {
+ opt = opt[keys[i]];
+ } else {
+ this._warning( {
+ type: $.jPlayer.warning.OPTION_KEY,
+ context: key,
+ message: $.jPlayer.warningMsg.OPTION_KEY,
+ hint: $.jPlayer.warningHint.OPTION_KEY
+ });
+ return undefined;
+ }
+ }
+ return opt;
+ }
+
+ // Enables use: options("someOptionObject", someObject}). Creates: {someOptionObject:someObject}
+ // Enables use: options("someOption", someValue). Creates: {someOption:someValue}
+ // Enables use: options("someOptionObject.someOption", someValue). Creates: {someOptionObject:{someOption:someValue}}
+
+ options = {};
+ var opts = options;
+
+ for(var j = 0; j < keys.length; j++) {
+ if(j < keys.length - 1) {
+ opts[keys[j]] = {};
+ opts = opts[keys[j]];
+ } else {
+ opts[keys[j]] = value;
+ }
+ }
+ }
+
+ // Otherwise enables use: options(optionObject). Uses original object (the key)
+
+ this._setOptions(options);
+
+ return this;
+ },
+ _setOptions: function(options) {
+ var self = this;
+ $.each(options, function(key, value) { // This supports the 2 level depth that the options of jPlayer has. Would review if we ever need more depth.
+ self._setOption(key, value);
+ });
+
+ return this;
+ },
+ _setOption: function(key, value) {
+ var self = this;
+
+ // The ability to set options is limited at this time.
+
+ switch(key) {
+ case "volume" :
+ this.volume(value);
+ break;
+ case "muted" :
+ this._muted(value);
+ break;
+ case "cssSelectorAncestor" :
+ this._cssSelectorAncestor(value); // Set and refresh all associations for the new ancestor.
+ break;
+ case "cssSelector" :
+ $.each(value, function(fn, cssSel) {
+ self._cssSelector(fn, cssSel); // NB: The option is set inside this function, after further validity checks.
+ });
+ break;
+ case "fullScreen" :
+ if(this.options[key] !== value) { // if changed
+ this._removeUiClass();
+ this.options[key] = value;
+ this._refreshSize();
+ }
+ break;
+ case "size" :
+ if(!this.options.fullScreen && this.options[key].cssClass !== value.cssClass) {
+ this._removeUiClass();
+ }
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this._refreshSize();
+ break;
+ case "sizeFull" :
+ if(this.options.fullScreen && this.options[key].cssClass !== value.cssClass) {
+ this._removeUiClass();
+ }
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this._refreshSize();
+ break;
+ case "autohide" :
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this._updateAutohide();
+ break;
+ case "loop" :
+ this._loop(value);
+ break;
+ case "nativeVideoControls" :
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls);
+ this._restrictNativeVideoControls();
+ this._updateNativeVideoControls();
+ break;
+ case "noFullScreen" :
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); // Need to check again as noFullScreen can depend on this flag and the restrict() can override it.
+ this.status.noFullScreen = this._uaBlocklist(this.options.noFullScreen);
+ this._restrictNativeVideoControls();
+ this._updateButtons();
+ break;
+ case "noVolume" :
+ this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed.
+ this.status.noVolume = this._uaBlocklist(this.options.noVolume);
+ this._updateVolume();
+ this._updateMute();
+ break;
+ case "emulateHtml" :
+ if(this.options[key] !== value) { // To avoid multiple event handlers being created, if true already.
+ this.options[key] = value;
+ if(value) {
+ this._emulateHtmlBridge();
+ } else {
+ this._destroyHtmlBridge();
+ }
+ }
+ break;
+ }
+
+ return this;
+ },
+ // End of: (Options code adapted from ui.widget.js)
+
+ _refreshSize: function() {
+ this._setSize(); // update status and jPlayer element size
+ this._addUiClass(); // update the ui class
+ this._updateSize(); // update internal sizes
+ this._updateButtons();
+ this._updateAutohide();
+ this._trigger($.jPlayer.event.resize);
+ },
+ _setSize: function() {
+ // Determine the current size from the options
+ if(this.options.fullScreen) {
+ this.status.width = this.options.sizeFull.width;
+ this.status.height = this.options.sizeFull.height;
+ this.status.cssClass = this.options.sizeFull.cssClass;
+ } else {
+ this.status.width = this.options.size.width;
+ this.status.height = this.options.size.height;
+ this.status.cssClass = this.options.size.cssClass;
+ }
+
+ // Set the size of the jPlayer area.
+ this.element.css({'width': this.status.width, 'height': this.status.height});
+ },
+ _addUiClass: function() {
+ if(this.ancestorJq.length) {
+ this.ancestorJq.addClass(this.status.cssClass);
+ }
+ },
+ _removeUiClass: function() {
+ if(this.ancestorJq.length) {
+ this.ancestorJq.removeClass(this.status.cssClass);
+ }
+ },
+ _updateSize: function() {
+ // The poster uses show/hide so can simply resize it.
+ this.internal.poster.jq.css({'width': this.status.width, 'height': this.status.height});
+
+ // Video html or flash resized if necessary at this time, or if native video controls being used.
+ if(!this.status.waitForPlay && this.html.active && this.status.video || this.html.video.available && this.html.used && this.status.nativeVideoControls) {
+ this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height});
+ }
+ else if(!this.status.waitForPlay && this.flash.active && this.status.video) {
+ this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height});
+ }
+ },
+ _updateAutohide: function() {
+ var self = this,
+ event = "mousemove.jPlayer",
+ namespace = ".jPlayerAutohide",
+ eventType = event + namespace,
+ handler = function() {
+ self.css.jq.gui.fadeIn(self.options.autohide.fadeIn, function() {
+ clearTimeout(self.internal.autohideId);
+ self.internal.autohideId = setTimeout( function() {
+ self.css.jq.gui.fadeOut(self.options.autohide.fadeOut);
+ }, self.options.autohide.hold);
+ });
+ };
+
+ if(this.css.jq.gui.length) {
+
+ // End animations first so that its callback is executed now.
+ // Otherwise an in progress fadeIn animation still has the callback to fadeOut again.
+ this.css.jq.gui.stop(true, true);
+
+ // Removes the fadeOut operation from the fadeIn callback.
+ clearTimeout(this.internal.autohideId);
+
+ this.element.unbind(namespace);
+ this.css.jq.gui.unbind(namespace);
+
+ if(!this.status.nativeVideoControls) {
+ if(this.options.fullScreen && this.options.autohide.full || !this.options.fullScreen && this.options.autohide.restored) {
+ this.element.bind(eventType, handler);
+ this.css.jq.gui.bind(eventType, handler);
+ this.css.jq.gui.hide();
+ } else {
+ this.css.jq.gui.show();
+ }
+ } else {
+ this.css.jq.gui.hide();
+ }
+ }
+ },
+ fullScreen: function() {
+ this._setOption("fullScreen", true);
+ },
+ restoreScreen: function() {
+ this._setOption("fullScreen", false);
+ },
+ _html_initMedia: function() {
+ this.htmlElement.media.src = this.status.src;
+
+ if(this.options.preload !== 'none') {
+ this._html_load(); // See function for comments
+ }
+ this._trigger($.jPlayer.event.timeupdate); // The flash generates this event for its solution.
+ },
+ _html_setAudio: function(media) {
+ var self = this;
+ // Always finds a format due to checks in setMedia()
+ $.each(this.formats, function(priority, format) {
+ if(self.html.support[format] && media[format]) {
+ self.status.src = media[format];
+ self.status.format[format] = true;
+ self.status.formatType = format;
+ return false;
+ }
+ });
+ this.htmlElement.media = this.htmlElement.audio;
+ this._html_initMedia();
+ },
+ _html_setVideo: function(media) {
+ var self = this;
+ // Always finds a format due to checks in setMedia()
+ $.each(this.formats, function(priority, format) {
+ if(self.html.support[format] && media[format]) {
+ self.status.src = media[format];
+ self.status.format[format] = true;
+ self.status.formatType = format;
+ return false;
+ }
+ });
+ if(this.status.nativeVideoControls) {
+ this.htmlElement.video.poster = this._validString(media.poster) ? media.poster : "";
+ }
+ this.htmlElement.media = this.htmlElement.video;
+ this._html_initMedia();
+ },
+ _html_resetMedia: function() {
+ if(this.htmlElement.media) {
+ if(this.htmlElement.media.id === this.internal.video.id && !this.status.nativeVideoControls) {
+ this.internal.video.jq.css({'width':'0px', 'height':'0px'});
+ }
+ this.htmlElement.media.pause();
+ }
+ },
+ _html_clearMedia: function() {
+ if(this.htmlElement.media) {
+ this.htmlElement.media.src = "";
+ this.htmlElement.media.load(); // Stops an old, "in progress" download from continuing the download. Triggers the loadstart, error and emptied events, due to the empty src. Also an abort event if a download was in progress.
+ }
+ },
+ _html_load: function() {
+ // This function remains to allow the early HTML5 browsers to work, such as Firefox 3.6
+ // A change in the W3C spec for the media.load() command means that this is no longer necessary.
+ // This command should be removed and actually causes minor undesirable effects on some browsers. Such as loading the whole file and not only the metadata.
+ if(this.status.waitForLoad) {
+ this.status.waitForLoad = false;
+ this.htmlElement.media.load();
+ }
+ clearTimeout(this.internal.htmlDlyCmdId);
+ },
+ _html_play: function(time) {
+ var self = this;
+ this._html_load(); // Loads if required and clears any delayed commands.
+
+ this.htmlElement.media.play(); // Before currentTime attempt otherwise Firefox 4 Beta never loads.
+
+ if(!isNaN(time)) {
+ try {
+ this.htmlElement.media.currentTime = time;
+ } catch(err) {
+ this.internal.htmlDlyCmdId = setTimeout(function() {
+ self.play(time);
+ }, 100);
+ return; // Cancel execution and wait for the delayed command.
+ }
+ }
+ this._html_checkWaitForPlay();
+ },
+ _html_pause: function(time) {
+ var self = this;
+
+ if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation.
+ this._html_load(); // Loads if required and clears any delayed commands.
+ } else {
+ clearTimeout(this.internal.htmlDlyCmdId);
+ }
+
+ // Order of these commands is important for Safari (Win) and IE9. Pause then change currentTime.
+ this.htmlElement.media.pause();
+
+ if(!isNaN(time)) {
+ try {
+ this.htmlElement.media.currentTime = time;
+ } catch(err) {
+ this.internal.htmlDlyCmdId = setTimeout(function() {
+ self.pause(time);
+ }, 100);
+ return; // Cancel execution and wait for the delayed command.
+ }
+ }
+ if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button.
+ this._html_checkWaitForPlay();
+ }
+ },
+ _html_playHead: function(percent) {
+ var self = this;
+ this._html_load(); // Loads if required and clears any delayed commands.
+ try {
+ if((typeof this.htmlElement.media.seekable === "object") && (this.htmlElement.media.seekable.length > 0)) {
+ this.htmlElement.media.currentTime = percent * this.htmlElement.media.seekable.end(this.htmlElement.media.seekable.length-1) / 100;
+ } else if(this.htmlElement.media.duration > 0 && !isNaN(this.htmlElement.media.duration)) {
+ this.htmlElement.media.currentTime = percent * this.htmlElement.media.duration / 100;
+ } else {
+ throw "e";
+ }
+ } catch(err) {
+ this.internal.htmlDlyCmdId = setTimeout(function() {
+ self.playHead(percent);
+ }, 100);
+ return; // Cancel execution and wait for the delayed command.
+ }
+ if(!this.status.waitForLoad) {
+ this._html_checkWaitForPlay();
+ }
+ },
+ _html_checkWaitForPlay: function() {
+ if(this.status.waitForPlay) {
+ this.status.waitForPlay = false;
+ if(this.css.jq.videoPlay.length) {
+ this.css.jq.videoPlay.hide();
+ }
+ if(this.status.video) {
+ this.internal.poster.jq.hide();
+ this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height});
+ }
+ }
+ },
+ _html_volume: function(v) {
+ if(this.html.audio.available) {
+ this.htmlElement.audio.volume = v;
+ }
+ if(this.html.video.available) {
+ this.htmlElement.video.volume = v;
+ }
+ },
+ _html_mute: function(m) {
+ if(this.html.audio.available) {
+ this.htmlElement.audio.muted = m;
+ }
+ if(this.html.video.available) {
+ this.htmlElement.video.muted = m;
+ }
+ },
+ _flash_setAudio: function(media) {
+ var self = this;
+ try {
+ // Always finds a format due to checks in setMedia()
+ $.each(this.formats, function(priority, format) {
+ if(self.flash.support[format] && media[format]) {
+ switch (format) {
+ case "m4a" :
+ case "fla" :
+ self._getMovie().fl_setAudio_m4a(media[format]);
+ break;
+ case "mp3" :
+ self._getMovie().fl_setAudio_mp3(media[format]);
+ break;
+ }
+ self.status.src = media[format];
+ self.status.format[format] = true;
+ self.status.formatType = format;
+ return false;
+ }
+ });
+
+ if(this.options.preload === 'auto') {
+ this._flash_load();
+ this.status.waitForLoad = false;
+ }
+ } catch(err) { this._flashError(err); }
+ },
+ _flash_setVideo: function(media) {
+ var self = this;
+ try {
+ // Always finds a format due to checks in setMedia()
+ $.each(this.formats, function(priority, format) {
+ if(self.flash.support[format] && media[format]) {
+ switch (format) {
+ case "m4v" :
+ case "flv" :
+ self._getMovie().fl_setVideo_m4v(media[format]);
+ break;
+ }
+ self.status.src = media[format];
+ self.status.format[format] = true;
+ self.status.formatType = format;
+ return false;
+ }
+ });
+
+ if(this.options.preload === 'auto') {
+ this._flash_load();
+ this.status.waitForLoad = false;
+ }
+ } catch(err) { this._flashError(err); }
+ },
+ _flash_resetMedia: function() {
+ this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Must do via CSS as setting attr() to zero causes a jQuery error in IE.
+ this._flash_pause(NaN);
+ },
+ _flash_clearMedia: function() {
+ try {
+ this._getMovie().fl_clearMedia();
+ } catch(err) { this._flashError(err); }
+ },
+ _flash_load: function() {
+ try {
+ this._getMovie().fl_load();
+ } catch(err) { this._flashError(err); }
+ this.status.waitForLoad = false;
+ },
+ _flash_play: function(time) {
+ try {
+ this._getMovie().fl_play(time);
+ } catch(err) { this._flashError(err); }
+ this.status.waitForLoad = false;
+ this._flash_checkWaitForPlay();
+ },
+ _flash_pause: function(time) {
+ try {
+ this._getMovie().fl_pause(time);
+ } catch(err) { this._flashError(err); }
+ if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button.
+ this.status.waitForLoad = false;
+ this._flash_checkWaitForPlay();
+ }
+ },
+ _flash_playHead: function(p) {
+ try {
+ this._getMovie().fl_play_head(p);
+ } catch(err) { this._flashError(err); }
+ if(!this.status.waitForLoad) {
+ this._flash_checkWaitForPlay();
+ }
+ },
+ _flash_checkWaitForPlay: function() {
+ if(this.status.waitForPlay) {
+ this.status.waitForPlay = false;
+ if(this.css.jq.videoPlay.length) {
+ this.css.jq.videoPlay.hide();
+ }
+ if(this.status.video) {
+ this.internal.poster.jq.hide();
+ this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height});
+ }
+ }
+ },
+ _flash_volume: function(v) {
+ try {
+ this._getMovie().fl_volume(v);
+ } catch(err) { this._flashError(err); }
+ },
+ _flash_mute: function(m) {
+ try {
+ this._getMovie().fl_mute(m);
+ } catch(err) { this._flashError(err); }
+ },
+ _getMovie: function() {
+ return document[this.internal.flash.id];
+ },
+ _checkForFlash: function (version) {
+ // Function checkForFlash adapted from FlashReplace by Robert Nyman
+ // http://code.google.com/p/flashreplace/
+ var flashIsInstalled = false;
+ var flash;
+ if(window.ActiveXObject){
+ try{
+ flash = new ActiveXObject(("ShockwaveFlash.ShockwaveFlash." + version));
+ flashIsInstalled = true;
+ }
+ catch(e){
+ // Throws an error if the version isn't available
+ }
+ }
+ else if(navigator.plugins && navigator.mimeTypes.length > 0){
+ flash = navigator.plugins["Shockwave Flash"];
+ if(flash){
+ var flashVersion = navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/, "$1");
+ if(flashVersion >= version){
+ flashIsInstalled = true;
+ }
+ }
+ }
+ return flashIsInstalled;
+ },
+ _validString: function(url) {
+ return (url && typeof url === "string"); // Empty strings return false
+ },
+ _limitValue: function(value, min, max) {
+ return (value < min) ? min : ((value > max) ? max : value);
+ },
+ _urlNotSetError: function(context) {
+ this._error( {
+ type: $.jPlayer.error.URL_NOT_SET,
+ context: context,
+ message: $.jPlayer.errorMsg.URL_NOT_SET,
+ hint: $.jPlayer.errorHint.URL_NOT_SET
+ });
+ },
+ _flashError: function(error) {
+ var errorType;
+ if(!this.internal.ready) {
+ errorType = "FLASH";
+ } else {
+ errorType = "FLASH_DISABLED";
+ }
+ this._error( {
+ type: $.jPlayer.error[errorType],
+ context: this.internal.flash.swf,
+ message: $.jPlayer.errorMsg[errorType] + error.message,
+ hint: $.jPlayer.errorHint[errorType]
+ });
+ // Allow the audio player to recover if display:none and then shown again, or with position:fixed on Firefox.
+ // This really only affects audio in a media player, as an audio player could easily move the jPlayer element away from such issues.
+ this.internal.flash.jq.css({'width':'1px', 'height':'1px'});
+ },
+ _error: function(error) {
+ this._trigger($.jPlayer.event.error, error);
+ if(this.options.errorAlerts) {
+ this._alert("Error!" + (error.message ? "\n\n" + error.message : "") + (error.hint ? "\n\n" + error.hint : "") + "\n\nContext: " + error.context);
+ }
+ },
+ _warning: function(warning) {
+ this._trigger($.jPlayer.event.warning, undefined, warning);
+ if(this.options.warningAlerts) {
+ this._alert("Warning!" + (warning.message ? "\n\n" + warning.message : "") + (warning.hint ? "\n\n" + warning.hint : "") + "\n\nContext: " + warning.context);
+ }
+ },
+ _alert: function(message) {
+ alert("jPlayer " + this.version.script + " : id='" + this.internal.self.id +"' : " + message);
+ },
+ _emulateHtmlBridge: function() {
+ var self = this,
+ methods = $.jPlayer.emulateMethods;
+
+ // Emulate methods on jPlayer's DOM element.
+ $.each( $.jPlayer.emulateMethods.split(/\s+/g), function(i, name) {
+ self.internal.domNode[name] = function(arg) {
+ self[name](arg);
+ };
+
+ });
+
+ // Bubble jPlayer events to its DOM element.
+ $.each($.jPlayer.event, function(eventName,eventType) {
+ var nativeEvent = true;
+ $.each( $.jPlayer.reservedEvent.split(/\s+/g), function(i, name) {
+ if(name === eventName) {
+ nativeEvent = false;
+ return false;
+ }
+ });
+ if(nativeEvent) {
+ self.element.bind(eventType + ".jPlayer.jPlayerHtml", function() { // With .jPlayer & .jPlayerHtml namespaces.
+ self._emulateHtmlUpdate();
+ var domEvent = document.createEvent("Event");
+ domEvent.initEvent(eventName, false, true);
+ self.internal.domNode.dispatchEvent(domEvent);
+ });
+ }
+ // The error event would require a special case
+ });
+
+ // IE9 has a readyState property on all elements. The document should have it, but all (except media) elements inherit it in IE9. This conflicts with Popcorn, which polls the readyState.
+ },
+ _emulateHtmlUpdate: function() {
+ var self = this;
+
+ $.each( $.jPlayer.emulateStatus.split(/\s+/g), function(i, name) {
+ self.internal.domNode[name] = self.status[name];
+ });
+ $.each( $.jPlayer.emulateOptions.split(/\s+/g), function(i, name) {
+ self.internal.domNode[name] = self.options[name];
+ });
+ },
+ _destroyHtmlBridge: function() {
+ var self = this;
+
+ // Bridge event handlers are also removed by destroy() through .jPlayer namespace.
+ this.element.unbind(".jPlayerHtml"); // Remove all event handlers created by the jPlayer bridge. So you can change the emulateHtml option.
+
+ // Remove the methods and properties
+ var emulated = $.jPlayer.emulateMethods + " " + $.jPlayer.emulateStatus + " " + $.jPlayer.emulateOptions;
+ $.each( emulated.split(/\s+/g), function(i, name) {
+ delete self.internal.domNode[name];
+ });
+ }
+ };
+
+ $.jPlayer.error = {
+ FLASH: "e_flash",
+ FLASH_DISABLED: "e_flash_disabled",
+ NO_SOLUTION: "e_no_solution",
+ NO_SUPPORT: "e_no_support",
+ URL: "e_url",
+ URL_NOT_SET: "e_url_not_set",
+ VERSION: "e_version"
+ };
+
+ $.jPlayer.errorMsg = {
+ FLASH: "jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ", // Used in: _flashError()
+ FLASH_DISABLED: "jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ", // Used in: _flashError()
+ NO_SOLUTION: "No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.", // Used in: _init()
+ NO_SUPPORT: "It is not possible to play any media format provided in setMedia() on this browser using your current options.", // Used in: setMedia()
+ URL: "Media URL could not be loaded.", // Used in: jPlayerFlashEvent() and _addHtmlEventListeners()
+ URL_NOT_SET: "Attempt to issue media playback commands, while no media url is set.", // Used in: load(), play(), pause(), stop() and playHead()
+ VERSION: "jPlayer " + $.jPlayer.prototype.version.script + " needs Jplayer.swf version " + $.jPlayer.prototype.version.needFlash + " but found " // Used in: jPlayerReady()
+ };
+
+ $.jPlayer.errorHint = {
+ FLASH: "Check your swfPath option and that Jplayer.swf is there.",
+ FLASH_DISABLED: "Check that you have not display:none; the jPlayer entity or any ancestor.",
+ NO_SOLUTION: "Review the jPlayer options: support and supplied.",
+ NO_SUPPORT: "Video or audio formats defined in the supplied option are missing.",
+ URL: "Check media URL is valid.",
+ URL_NOT_SET: "Use setMedia() to set the media URL.",
+ VERSION: "Update jPlayer files."
+ };
+
+ $.jPlayer.warning = {
+ CSS_SELECTOR_COUNT: "e_css_selector_count",
+ CSS_SELECTOR_METHOD: "e_css_selector_method",
+ CSS_SELECTOR_STRING: "e_css_selector_string",
+ OPTION_KEY: "e_option_key"
+ };
+
+ $.jPlayer.warningMsg = {
+ CSS_SELECTOR_COUNT: "The number of css selectors found did not equal one: ",
+ CSS_SELECTOR_METHOD: "The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",
+ CSS_SELECTOR_STRING: "The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",
+ OPTION_KEY: "The option requested in jPlayer('option') is undefined."
+ };
+
+ $.jPlayer.warningHint = {
+ CSS_SELECTOR_COUNT: "Check your css selector and the ancestor.",
+ CSS_SELECTOR_METHOD: "Check your method name.",
+ CSS_SELECTOR_STRING: "Check your css selector is a string.",
+ OPTION_KEY: "Check your option name."
+ };
+})(jQuery);
diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php
index caa3ac3f479..1240f1de2f0 100644
--- a/apps/media/lib_collection.php
+++ b/apps/media/lib_collection.php
@@ -127,7 +127,7 @@ class OC_MEDIA_COLLECTION{
$search='%';
}
$query=OC_DB::prepare("SELECT DISTINCT *PREFIX*media_artists.artist_name AS artist_name , *PREFIX*media_artists.artist_id AS artist_id FROM *PREFIX*media_artists
- INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=?");
+ INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=? ORDER BY artist_name");
return $query->execute(array($search,self::$uid))->fetchAll();
}
@@ -160,7 +160,7 @@ class OC_MEDIA_COLLECTION{
*/
static public function getAlbums($artist=0,$search='%',$exact=false){
$cmd="SELECT DISTINCT *PREFIX*media_albums.album_name AS album_name , *PREFIX*media_albums.album_artist AS album_artist , *PREFIX*media_albums.album_id AS album_id
- FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? ";
+ FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? ORDER BY album_name";
$params=array(self::$uid);
if($artist!=0){
$cmd.="AND *PREFIX*media_albums.album_artist = ? ";
@@ -233,7 +233,7 @@ class OC_MEDIA_COLLECTION{
}else{
$searchString='';
}
- $query=OC_DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString");
+ $query=OC_DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString ORDER BY song_track, song_name");
return $query->execute($params)->fetchAll();
}
@@ -378,4 +378,4 @@ class OC_MEDIA_COLLECTION{
}
}
-?> \ No newline at end of file
+?>
diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php
index c2bea2d836d..320b1f79199 100644
--- a/apps/media/lib_scanner.php
+++ b/apps/media/lib_scanner.php
@@ -120,7 +120,20 @@ class OC_MEDIA_SCANNER{
$title=stripslashes($data['comments']['title'][0]);
}
$size=$data['filesize'];
- $track=(isset($data['comments']['track']))?$data['comments']['track'][0]:0;
+ if (isset($data['comments']['track']))
+ {
+ $track = $data['comments']['track'][0];
+ }
+ else if (isset($data['comments']['track_number']))
+ {
+ $track = $data['comments']['track_number'][0];
+ $track = explode('/',$track);
+ $track = $track[0];
+ }
+ else
+ {
+ $track = 0;
+ }
$length=isset($data['playtime_seconds'])?round($data['playtime_seconds']):0;
}
if(!isset(self::$artists[$artist])){
diff --git a/apps/user_webfinger/appinfo/install.php b/apps/user_webfinger/appinfo/install.php
index 079043cd102..f570a3a249b 100644
--- a/apps/user_webfinger/appinfo/install.php
+++ b/apps/user_webfinger/appinfo/install.php
@@ -3,4 +3,4 @@ $appInfoDir = __DIR__;
$thisAppDir = dirname($appInfoDir);
$appsDir = dirname($thisAppDir);
$ownCloudDir = dirname($appsDir);
-symlink($thisAppDir, $ownCloudDir.'/.well-known');
+@symlink($thisAppDir, $ownCloudDir.'/.well-known');
diff --git a/core/js/jquery.infieldlabel.js b/core/js/jquery.infieldlabel.js
new file mode 100755
index 00000000000..f6a67b66ce1
--- /dev/null
+++ b/core/js/jquery.infieldlabel.js
@@ -0,0 +1,140 @@
+/*
+ * In-Field Label jQuery Plugin
+ * http://fuelyourcoding.com/scripts/infield.html
+ *
+ * Copyright (c) 2009 Doug Neiner
+ * Dual licensed under the MIT and GPL licenses.
+ * Uses the same license as jQuery, see:
+ * http://docs.jquery.com/License
+ *
+ * @version 0.1
+ */
+(function($){
+
+ $.InFieldLabels = function(label,field, options){
+ // To avoid scope issues, use 'base' instead of 'this'
+ // to reference this class from internal events and functions.
+ var base = this;
+
+ // Access to jQuery and DOM versions of each element
+ base.$label = $(label);
+ base.label = label;
+
+ base.$field = $(field);
+ base.field = field;
+
+ base.$label.data("InFieldLabels", base);
+ base.showing = true;
+
+ base.init = function(){
+ // Merge supplied options with default options
+ base.options = $.extend({},$.InFieldLabels.defaultOptions, options);
+
+ // Check if the field is already filled in
+ if(base.$field.val() != ""){
+ base.$label.hide();
+ base.showing = false;
+ };
+
+ base.$field.focus(function(){
+ base.fadeOnFocus();
+ }).blur(function(){
+ base.checkForEmpty(true);
+ }).bind('keydown.infieldlabel',function(e){
+ // Use of a namespace (.infieldlabel) allows us to
+ // unbind just this method later
+ base.hideOnChange(e);
+ }).change(function(e){
+ base.checkForEmpty();
+ }).bind('onPropertyChange', function(){
+ base.checkForEmpty();
+ });
+ };
+
+ // If the label is currently showing
+ // then fade it down to the amount
+ // specified in the settings
+ base.fadeOnFocus = function(){
+ if(base.showing){
+ base.setOpacity(base.options.fadeOpacity);
+ };
+ };
+
+ base.setOpacity = function(opacity){
+ base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
+ base.showing = (opacity > 0.0);
+ };
+
+ // Checks for empty as a fail safe
+ // set blur to true when passing from
+ // the blur event
+ base.checkForEmpty = function(blur){
+ if(base.$field.val() == ""){
+ base.prepForShow();
+ base.setOpacity( blur ? 1.0 : base.options.fadeOpacity );
+ } else {
+ base.setOpacity(0.0);
+ };
+ };
+
+ base.prepForShow = function(e){
+ if(!base.showing) {
+ // Prepare for a animate in...
+ base.$label.css({opacity: 0.0}).show();
+
+ // Reattach the keydown event
+ base.$field.bind('keydown.infieldlabel',function(e){
+ base.hideOnChange(e);
+ });
+ };
+ };
+
+ base.hideOnChange = function(e){
+ if(
+ (e.keyCode == 16) || // Skip Shift
+ (e.keyCode == 9) // Skip Tab
+ ) return;
+
+ if(base.showing){
+ base.$label.hide();
+ base.showing = false;
+ };
+
+ // Remove keydown event to save on CPU processing
+ base.$field.unbind('keydown.infieldlabel');
+ };
+
+ // Run the initialization method
+ base.init();
+ };
+
+ $.InFieldLabels.defaultOptions = {
+ fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be
+ fadeDuration: 300 // How long should it take to animate from 1.0 opacity to the fadeOpacity
+ };
+
+
+ $.fn.inFieldLabels = function(options){
+ return this.each(function(){
+ // Find input or textarea based on for= attribute
+ // The for attribute on the label must contain the ID
+ // of the input or textarea element
+ var for_attr = $(this).attr('for');
+ if( !for_attr ) return; // Nothing to attach, since the for field wasn't used
+
+
+ // Find the referenced input or textarea element
+ var $field = $(
+ "input#" + for_attr + "[type='text']," +
+ "input#" + for_attr + "[type='password']," +
+ "textarea#" + for_attr
+ );
+
+ if( $field.length == 0) return; // Again, nothing to attach
+
+ // Only create object for input[text], input[password], or textarea
+ (new $.InFieldLabels(this, $field[0], options));
+ });
+ };
+
+})(jQuery); \ No newline at end of file
diff --git a/core/js/setup.js b/core/js/setup.js
index b765d41ba35..94097785e42 100644
--- a/core/js/setup.js
+++ b/core/js/setup.js
@@ -7,7 +7,9 @@ $(document).ready(function() {
$('#dbhost').hide();
$('#dbhostlabel').hide();
}
-
+ $('#adminlogin').change(function(){
+ $('#adminlogin').val($.trim($('#adminlogin').val()));
+ });
$('#sqlite').click(function() {
$('#use_other_db').slideUp(250);
$('#dbhost').hide(250);
diff --git a/core/lostpassword/index.php b/core/lostpassword/index.php
index de0d393ec78..ede94dab2d7 100644
--- a/core/lostpassword/index.php
+++ b/core/lostpassword/index.php
@@ -14,7 +14,7 @@ if (isset($_POST['user'])) {
if (OC_User::userExists($_POST['user'])) {
$token = sha1($_POST['user']+uniqId());
OC_Preferences::setValue($_POST['user'], 'owncloud', 'lostpassword', $token);
- $email = OC_Preferences::getValue($_POST['user'], 'lostpassword', 'email', '');
+ $email = OC_Preferences::getValue($_POST['user'], 'settings', 'email', '');
if (!empty($email)) {
$link = OC_Helper::linkTo('core/lostpassword', 'resetpassword.php', null, true).'?user='.$_POST['user'].'&token='.$token;
$tmpl = new OC_Template('core/lostpassword', 'email');
diff --git a/files/ajax/move.php b/files/ajax/move.php
index 8a56a015486..3517901c6cf 100644
--- a/files/ajax/move.php
+++ b/files/ajax/move.php
@@ -14,7 +14,7 @@ $target = $_GET["target"];
if(OC_Files::move($dir,$file,$target,$file)){
OC_JSON::success(array("data" => array( "dir" => $dir, "files" => $file )));
}else{
- OC_JSON::error(array("data" => array( "message" => "Could move $file" )));
+ OC_JSON::error(array("data" => array( "message" => "Could not move $file" )));
}
?>
diff --git a/files/ajax/newfolder.php b/files/ajax/newfolder.php
index 6966e912c56..d244fb7be19 100644
--- a/files/ajax/newfolder.php
+++ b/files/ajax/newfolder.php
@@ -9,7 +9,7 @@ OC_JSON::checkLoggedIn();
$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
$foldername = isset( $_GET['foldername'] ) ? $_GET['foldername'] : '';
-if($foldername == '') {
+if(trim($foldername) == '') {
OC_JSON::error(array("data" => array( "message" => "Empty Foldername" )));
exit();
}
diff --git a/files/ajax/upload.php b/files/ajax/upload.php
index d9dafde7779..241edc216ff 100644
--- a/files/ajax/upload.php
+++ b/files/ajax/upload.php
@@ -14,9 +14,10 @@ if (!isset($_FILES['files'])) {
}
foreach ($_FILES['files']['error'] as $error) {
if ($error != 0) {
+ $l=new OC_L10N('files');
$errors = array(
0=>$l->t("There is no error, the file uploaded with success"),
- 1=>$l->t("The uploaded file exceeds the upload_max_filesize directive in php.ini"),
+ 1=>$l->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'),
2=>$l->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"),
3=>$l->t("The uploaded file was only partially uploaded"),
4=>$l->t("No file was uploaded"),
diff --git a/files/index.php b/files/index.php
index 4b3bbd1bfd4..fc69a42bec6 100644
--- a/files/index.php
+++ b/files/index.php
@@ -71,7 +71,7 @@ $breadcrumb = array();
$pathtohere = "";
foreach( explode( "/", $dir ) as $i ){
if( $i != "" ){
- $pathtohere .= "/$i";
+ $pathtohere .= "/".str_replace('+','%20', urlencode($i));
$breadcrumb[] = array( "dir" => $pathtohere, "name" => $i );
}
}
@@ -97,6 +97,7 @@ $tmpl = new OC_Template( "files", "index", "user" );
$tmpl->assign( "fileList", $list->fetchPage() );
$tmpl->assign( "breadcrumb", $breadcrumbNav->fetchPage() );
$tmpl->assign( 'dir', $dir);
+$tmpl->assign( 'readonly', !OC_Filesystem::is_writeable($dir));
$tmpl->assign( "files", $files );
$tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
$tmpl->assign( 'uploadMaxHumanFilesize', OC_Helper::humanFileSize($maxUploadFilesize));
diff --git a/files/js/fileactions.js b/files/js/fileactions.js
index 9e2688e82c1..6f0729e43b6 100644
--- a/files/js/fileactions.js
+++ b/files/js/fileactions.js
@@ -137,7 +137,7 @@ FileActions.register('all','Rename',function(){return OC.imagePath('core','actio
});
FileActions.register('dir','Open','',function(filename){
- window.location='index.php?dir='+$('#dir').val()+'/'+filename;
+ window.location='index.php?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
});
FileActions.setDefault('dir','Open');
diff --git a/files/js/filelist.js b/files/js/filelist.js
index 16f73ed58d6..35847e06dfe 100644
--- a/files/js/filelist.js
+++ b/files/js/filelist.js
@@ -40,7 +40,7 @@ FileList={
html = $('<tr></tr>').attr({ "data-type": "dir", "data-size": size, "data-file": name});
td = $('<td></td>').attr({"class": "filename", "style": 'background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')' });
td.append('<input type="checkbox" />');
- var link_elem = $('<a></a>').attr({ "class": "name", "href": "index.php?dir="+ encodeURIComponent($('#dir').val()+'/'+name) });
+ var link_elem = $('<a></a>').attr({ "class": "name", "href": "index.php?dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/') });
link_elem.append($('<span></span>').addClass('nametext').text(name));
td.append(link_elem);
html.append(td);
@@ -136,6 +136,8 @@ FileList={
var newname=input.val();
tr.attr('data-file',newname);
td.children('a.name').empty();
+ var path = td.children('a.name').attr('href');
+ td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname)));
if(newname.indexOf('.')>0){
basename=newname.substr(0,newname.lastIndexOf('.'));
}else{
diff --git a/files/templates/index.php b/files/templates/index.php
index 21a4e2df010..595e8803353 100644
--- a/files/templates/index.php
+++ b/files/templates/index.php
@@ -1,42 +1,37 @@
<div id="controls">
<?php echo($_['breadcrumb']); ?>
- <?php if (!isset($_['readonly']) || !$_['readonly']) {?>
- <div class="actions">
- <div id='new' class='button'>
- <a>
- <?php echo $l->t('New');?>
- </a>
- <ul class="popup popupTop">
- <li style="background-image:url('<?php echo mimetype_icon('text/plain') ?>')" data-type='file'><p><?php echo $l->t('Text file');?></p></li>
- <li style="background-image:url('<?php echo mimetype_icon('dir') ?>')" data-type='folder'><p><?php echo $l->t('Folder');?></p></li>
-<!-- <li style="background-image:url('<?php echo mimetype_icon('dir') ?>')" data-type='web'><p><?php echo $l->t('From the web');?></p></li> -->
- </ul>
+ <?php if (!isset($_['readonly']) || !$_['readonly']):?>
+ <div class="actions">
+ <div id='new' class='button'>
+ <a>
+ <?php echo $l->t('New');?>
+ </a>
+ <ul class="popup popupTop">
+ <li style="background-image:url('<?php echo mimetype_icon('text/plain') ?>')" data-type='file'><p><?php echo $l->t('Text file');?></p></li>
+ <li style="background-image:url('<?php echo mimetype_icon('dir') ?>')" data-type='folder'><p><?php echo $l->t('Folder');?></p></li>
+ <!-- <li style="background-image:url('<?php echo mimetype_icon('dir') ?>')" data-type='web'><p><?php echo $l->t('From the web');?></p></li> -->
+ </ul>
+ </div>
+ <div class="file_upload_wrapper svg">
+ <form data-upload-id='1' class="file_upload_form" action="ajax/upload.php" method="post" enctype="multipart/form-data" target="file_upload_target_1">
+ <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
+ <input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
+ <input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
+ <button class="file_upload_filename"><img class='svg action' alt="Upload" src="<?php echo image_path("core", "actions/upload.svg"); ?>" /></button>
+ <input class="file_upload_start" type="file" name='files[]'/>
+ <a href="#" class="file_upload_button_wrapper" onclick="return false;" title="<?php echo $l->t('Upload'); echo ' max. '.$_['uploadMaxHumanFilesize'] ?>"></a>
+ <iframe name="file_upload_target_1" class='file_upload_target' src=""></iframe>
+ </form>
+ </div>
</div>
- <div class="file_upload_wrapper svg">
- <form data-upload-id='1' class="file_upload_form" action="ajax/upload.php" method="post" enctype="multipart/form-data" target="file_upload_target_1">
- <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
- <input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
- <input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
- <button class="file_upload_filename"><img class='svg action' alt="Upload" src="<?php echo image_path("core", "actions/upload.svg"); ?>" /></button>
- <input class="file_upload_start" type="file" name='files[]'/>
- <a href="#" class="file_upload_button_wrapper" onclick="return false;" title="<?php echo $l->t('Upload'); echo ' max. '.$_['uploadMaxHumanFilesize'] ?>"></a>
- <iframe name="file_upload_target_1" class='file_upload_target' src=""></iframe>
- </form>
- </div>
- </div>
- <div id="file_action_panel">
- </div>
+ <div id="file_action_panel"></div>
+ <?php endif;?>
</div>
-<?php
-}
-?>
<div id='notification'></div>
-<?php
-if (isset($_['files'])) {
- if (!count($_['files'])) { ?>
-<div id="emptyfolder"><?php echo $l->t('Nothing in here. Upload something!')?></div>
-<?php }}?>
+<?php if (isset($_['files']) and ! $_['readonly'] and count($_['files'])==0):?>
+ <div id="emptyfolder"><?php echo $l->t('Nothing in here. Upload something!')?></div>
+<?php endif; ?>
<table>
<thead>
@@ -53,7 +48,7 @@ if (isset($_['files'])) {
<th id="headerDate"><span id="modified"><?php echo $l->t( 'Modified' ); ?></span><span class="selectedActions"><a href="" title="Delete" class="delete"><img class="svg" alt="<?php echo $l->t('Delete')?>" src="<?php echo image_path("core", "actions/delete.svg"); ?>" /></a></span></th>
</tr>
</thead>
- <tbody id="fileList">
+ <tbody id="fileList" data-readonly="<?php echo $_['readonly'];?>">
<?php echo($_['fileList']); ?>
</tbody>
</table>
diff --git a/files/templates/part.list.php b/files/templates/part.list.php
index 7ae5756c22e..fdcd7d6f8a7 100644
--- a/files/templates/part.list.php
+++ b/files/templates/part.list.php
@@ -4,11 +4,15 @@
if($simple_size_color<0) $simple_size_color = 0;
$relative_modified_date = relative_modified_date($file['mtime']);
$relative_date_color = round((time()-$file['mtime'])/60/60/24*14); // the older the file, the brighter the shade of grey; days*14
- if($relative_date_color>200) $relative_date_color = 200; ?>
- <tr data-file="<?php echo str_replace('+','%20',urlencode($file['name']));?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>'>
+ if($relative_date_color>200) $relative_date_color = 200;
+ $name = str_replace('+','%20',urlencode($file['name']));
+ $name = str_replace('%2F','/', $name);
+ $directory = str_replace('+','%20',urlencode($file['directory']));
+ $directory = str_replace('%2F','/', $directory); ?>
+ <tr data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>'>
<td class="filename svg" style="background-image:url(<?php if($file['type'] == 'dir') echo mimetype_icon('dir'); else echo mimetype_icon($file['mimetype']); ?>)">
<?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" /><?php } ?>
- <a class="name" href="<?php if($file['type'] == 'dir') echo $_['baseURL'].$file['directory'].'/'.$file['name']; else echo $_['downloadURL'].urlencode($file['directory']).'/'.urlencode($file['name']); ?>" title="">
+ <a class="name" href="<?php if($file['type'] == 'dir') echo $_['baseURL'].$directory.'/'.$name; else echo $_['downloadURL'].$directory.'/'.$name; ?>" title="">
<span class="nametext">
<?php if($file['type'] == 'dir'):?>
<?php echo htmlspecialchars($file['name']);?>
diff --git a/index.php b/index.php
index 558733e1cda..9bd460be353 100644
--- a/index.php
+++ b/index.php
@@ -88,7 +88,7 @@ else {
if(defined("DEBUG") && DEBUG) {
OC_Log::write('core','Setting remember login to cookie',OC_Log::DEBUG);
}
- $token = md5($_POST["user"].time());
+ $token = md5($_POST["user"].time().$_POST['password']);
OC_Preferences::setValue($_POST['user'], 'login', 'token', $token);
OC_User::setMagicInCookie($_POST["user"], $token);
}
@@ -100,14 +100,15 @@ else {
$error = true;
}
}
- // The user is already authenticated using Apaches AuthType Basic... very usable in combination with LDAP
- elseif(isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"])){
- if (OC_User::login($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"])) {
- OC_User::unsetMagicInCookie();
- OC_Util::redirectToDefaultPage();
- }else{
- $error = true;
- }
+ // The user is already authenticated using Apaches AuthType Basic... very usable in combination with LDAP
+ elseif(isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"])){
+ if (OC_User::login($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"])) {
+ //OC_Log::write('core',"Logged in with HTTP Authentication",OC_Log::DEBUG);
+ OC_User::unsetMagicInCookie();
+ OC_Util::redirectToDefaultPage();
+ }else{
+ $error = true;
}
+ }
OC_Template::printGuestPage('', 'login', array('error' => $error, 'redirect' => isset($_REQUEST['redirect_url'])?$_REQUEST['redirect_url']:'' ));
}
diff --git a/lib/app.php b/lib/app.php
index 2e03db6c8d2..6b35cdffec9 100644
--- a/lib/app.php
+++ b/lib/app.php
@@ -94,7 +94,15 @@ class OC_App{
*/
public static function enable( $app ){
if(!OC_Installer::isInstalled($app)){
- OC_Installer::installShippedApp($app);
+ // check if app is a shipped app or not. OCS apps have an integer as id, shipped apps use a string
+ if(!is_numeric($app)){
+ OC_Installer::installShippedApp($app);
+ }else{
+ $download=OC_OCSClient::getApplicationDownload($app,1);
+ if(isset($download['downloadlink']) and $download['downloadlink']<>'') {
+ OC_Installer::installApp(array('source'=>'http','href'=>$download['downloadlink']));
+ }
+ }
}
OC_Appconfig::setValue( $app, 'enabled', 'yes' );
}
@@ -107,6 +115,7 @@ class OC_App{
* This function set an app as disabled in appconfig.
*/
public static function disable( $app ){
+ // check if app is a shiped app or not. if not delete
OC_Appconfig::setValue( $app, 'enabled', 'no' );
}
diff --git a/lib/base.php b/lib/base.php
index f1303c298e0..83b14f2b970 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -70,6 +70,31 @@ class OC{
}
}
+ /**
+ * autodetects the formfactor of the used device
+ * default -> the normal desktop browser interface
+ * mobile -> interface for smartphones
+ * tablet -> interface for tablets
+ * standalone -> the default interface but without header, footer and sidebar. just the application. useful to ue just a specific app on the desktop in a standalone window.
+ */
+ public static function detectFormfactor(){
+ // please add more useragent strings for other devices
+ if(isset($_SERVER['HTTP_USER_AGENT'])){
+ if(stripos($_SERVER['HTTP_USER_AGENT'],'ipad')>0) {
+ $mode='tablet';
+ }elseif(stripos($_SERVER['HTTP_USER_AGENT'],'iphone')>0){
+ $mode='mobile';
+ }elseif((stripos($_SERVER['HTTP_USER_AGENT'],'N9')>0) and (stripos($_SERVER['HTTP_USER_AGENT'],'nokia')>0)){
+ $mode='mobile';
+ }else{
+ $mode='default';
+ }
+ }else{
+ $mode='default';
+ }
+ return($mode);
+ }
+
public static function init(){
// register autoloader
spl_autoload_register(array('OC','autoload'));
@@ -139,6 +164,16 @@ class OC{
ini_set('session.cookie_httponly','1;');
session_start();
+ // if the formfactor is not yet autodetected do the autodetection now. For possible forfactors check the detectFormfactor documentation
+ if(!isset($_SESSION['formfactor'])){
+ $_SESSION['formfactor']=OC::detectFormfactor();
+ }
+ // allow manual override via GET parameter
+ if(isset($_GET['formfactor'])){
+ $_SESSION['formfactor']=$_GET['formfactor'];
+ }
+
+
// Add the stuff we need always
OC_Util::addScript( "jquery-1.6.4.min" );
OC_Util::addScript( "jquery-ui-1.8.14.custom.min" );
@@ -220,5 +255,7 @@ OC::init();
require_once('fakedirstream.php');
+
+
// FROM search.php
new OC_Search_Provider_File();
diff --git a/lib/db.php b/lib/db.php
index 16d477d1b86..05ed8398b7b 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -279,7 +279,7 @@ class OC_DB {
'output' => $file,
'end_of_line' => "\n"
);
- self::$schema->dumpDatabase( $definition, $dump_options, MDB2_SCHEMA_DUMP_STRUCTURE );
+ self::$schema->dumpDatabase( $definition, $dump_options, $mode );
return true;
}
diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php
index 87efdb15ad2..18bfd69d719 100644
--- a/lib/filestorage/local.php
+++ b/lib/filestorage/local.php
@@ -51,7 +51,7 @@ class OC_Filestorage_Local extends OC_Filestorage{
return is_readable($this->datadir.$path);
}
public function is_writeable($path){
- return is_writeable($this->datadir.$path);
+ return is_writable($this->datadir.$path);
}
public function file_exists($path){
return file_exists($this->datadir.$path);
diff --git a/lib/filesystem.php b/lib/filesystem.php
index c3830b34168..8765775dc29 100644
--- a/lib/filesystem.php
+++ b/lib/filesystem.php
@@ -107,35 +107,6 @@ class OC_Filesystem{
}
/**
- * check if the current users has the right premissions to read a file
- * @param string path
- * @return bool
- */
- static private function canRead($path){
- if(substr($path,0,1)!=='/'){
- $path='/'.$path;
- }
- if(strstr($path,'/../') || strrchr($path, '/') === '/..' ){
- return false;
- }
- return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there
- }
- /**
- * check if the current users has the right premissions to write a file
- * @param string path
- * @return bool
- */
- static private function canWrite($path){
- if(substr($path,0,1)!=='/'){
- $path='/'.$path;
- }
- if(strstr($path,'/../') || strrchr($path, '/') === '/..' ){
- return false;
- }
- return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there
- }
-
- /**
* mount an OC_Filestorage in our virtual filesystem
* @param OC_Filestorage storage
* @param string mountpoint
@@ -204,15 +175,28 @@ class OC_Filesystem{
*/
static public function getLocalFile($path){
$parent=substr($path,0,strrpos($path,'/'));
- if(self::canRead($parent) and $storage=self::getStorage($path)){
+ if(self::isValidPath($parent) and $storage=self::getStorage($path)){
return $storage->getLocalFile(self::getInternalPath($path));
}
}
/**
+ * check if the requested path is valid
+ * @param string path
+ * @return bool
+ */
+ static public function isValidPath($path){
+ if(substr($path,0,1)!=='/'){
+ $path='/'.$path;
+ }
+ if(strstr($path,'/../') || strrchr($path, '/') === '/..' ){
+ return false;
+ }
+ return true;
+ }
+ /**
* following functions are equivilent to their php buildin equivilents for arguments/return values.
*/
-
static public function mkdir($path){
return self::basicOperation('mkdir',$path,array('create','write'));
}
@@ -274,7 +258,7 @@ class OC_Filesystem{
return self::basicOperation('unlink',$path,array('delete'));
}
static public function rename($path1,$path2){
- if(OC_FileProxy::runPreProxies('rename',$path1,$path2) and self::canWrite($path1) and self::canWrite($path2)){
+ if(OC_FileProxy::runPreProxies('rename',$path1,$path2) and self::is_writeable($path1) and self::isValidPath($path2)){
$run=true;
OC_Hook::emit( 'OC_Filesystem', 'rename', array( 'oldpath' => $path1 ,'newpath'=>$path2, 'run' => &$run));
if($run){
@@ -295,7 +279,7 @@ class OC_Filesystem{
}
}
static public function copy($path1,$path2){
- if(OC_FileProxy::runPreProxies('copy',$path1,$path2) and self::canRead($path1) and self::canWrite($path2)){
+ if(OC_FileProxy::runPreProxies('copy',$path1,$path2) and self::is_readable($path1) and self::isValidPath($path2)){
$run=true;
OC_Hook::emit( 'OC_Filesystem', 'copy', array( 'oldpath' => $path1 ,'newpath'=>$path2, 'run' => &$run));
$exists=self::file_exists($path2);
@@ -350,13 +334,13 @@ class OC_Filesystem{
return self::basicOperation('fopen',$path,$hooks,$mode);
}
static public function toTmpFile($path){
- if(OC_FileProxy::runPreProxies('toTmpFile',$path) and self::canRead($path) and $storage=self::getStorage($path)){
+ if(OC_FileProxy::runPreProxies('toTmpFile',$path) and self::isValidPath($path) and $storage=self::getStorage($path)){
OC_Hook::emit( 'OC_Filesystem', 'read', array( 'path' => $path));
return $storage->toTmpFile(self::getInternalPath($path));
}
}
static public function fromTmpFile($tmpFile,$path){
- if(OC_FileProxy::runPreProxies('copy',$tmpFile,$path) and self::canWrite($path) and $storage=self::getStorage($path)){
+ if(OC_FileProxy::runPreProxies('copy',$tmpFile,$path) and self::isValidPath($path) and $storage=self::getStorage($path)){
$run=true;
$exists=self::file_exists($path);
if(!$exists){
@@ -413,7 +397,7 @@ class OC_Filesystem{
* @return mixed
*/
private static function basicOperation($operation,$path,$hooks=array(),$extraParam=null){
- if(OC_FileProxy::runPreProxies($operation,$path, $extraParam) and self::canRead($path) and $storage=self::getStorage($path)){
+ if(OC_FileProxy::runPreProxies($operation,$path, $extraParam) and self::isValidPath($path) and $storage=self::getStorage($path)){
$interalPath=self::getInternalPath($path);
$run=true;
foreach($hooks as $hook){
diff --git a/lib/image.php b/lib/image.php
new file mode 100644
index 00000000000..45b6ad3918d
--- /dev/null
+++ b/lib/image.php
@@ -0,0 +1,554 @@
+<?php
+
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2011 Thomas Tanghus <thomas@tanghus.net>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/** From user comments at http://dk2.php.net/manual/en/function.exif-imagetype.php
+ * Don't know if it can come in handy?
+if ( ! function_exists( 'exif_imagetype' ) ) {
+ function exif_imagetype ( $filename ) {
+ if ( ( list($width, $height, $type, $attr) = getimagesize( $filename ) ) !== false ) {
+ return $type;
+ }
+ return false;
+ }
+}
+*/
+
+function ellipsis($str, $maxlen) {
+ if (strlen($str) > $maxlen) {
+ $characters = floor($maxlen / 2);
+ return substr($str, 0, $characters) . '...' . substr($str, -1 * $characters);
+ }
+ return $str;
+}
+
+/**
+ * Class for basic image manipulation
+ *
+ */
+class OC_Image {
+ static private $resource = false; // tmp resource.
+ static private $destroy = false; // if the resource is created withing the object.
+ static private $imagetype = IMAGETYPE_PNG; // Default to png if file type isn't evident.
+ static private $filepath = null;
+ /**
+ * @brief Constructor.
+ * @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function.
+ * If a resource is passed it is the job of the caller to destroy it using imagedestroy($var)
+ * @returns bool False on error
+ */
+ function __construct($imageref = null) {
+ //OC_Log::write('core','OC_Image::__construct, start', OC_Log::DEBUG);
+ if(!extension_loaded('gd') || !function_exists('gd_info')) {
+ //if(!function_exists('imagecreatefromjpeg')) {
+ OC_Log::write('core','OC_Image::__construct, GD module not installed', OC_Log::ERROR);
+ return false;
+ }
+ if(!is_null($imageref)) {
+ self::load($imageref);
+ }
+ }
+
+ /**
+ * @brief Destructor.
+ */
+ function __destruct() {
+ if(is_resource(self::$resource) && self::$destroy) {
+ imagedestroy(self::$resource); // Why does this issue a warning.
+ }
+ }
+
+ /**
+ * @brief Determine whether the object contains an image resource.
+ * @returns bool
+ */
+ public function valid() { // apparently you can't name a method 'empty'...
+ $ret = is_resource(self::$resource);
+ return $ret;
+ }
+
+ /**
+ * @brief Returns the MIME type of the image or an empty string if no image is loaded.
+ * @returns int
+ */
+ public function mimeType() {
+ return is_resource(self::$resource) ? image_type_to_mime_type(self::$imagetype) : '';
+ }
+
+ /**
+ * @brief Returns the width of the image or -1 if no image is loaded.
+ * @returns int
+ */
+ public function width() {
+ return is_resource(self::$resource) ? imagesx(self::$resource) : -1;
+ }
+
+ /**
+ * @brief Returns the height of the image or -1 if no image is loaded.
+ * @returns int
+ */
+ public function height() {
+ return is_resource(self::$resource) ? imagesy(self::$resource) : -1;
+ }
+
+ /**
+ * @brief Outputs the image.
+ * @returns bool
+ */
+ public function show() {
+ return $this->_output();
+ }
+
+ /**
+ * @brief Saves the image.
+ * @returns bool
+ */
+
+ public function save($filepath=null) {
+ if($filepath === null && self::$filepath === null) {
+ OC_Log::write('core','OC_Image::save. save() called with no path.', OC_Log::ERROR);
+ return false;
+ } elseif($filepath === null && $this->filepath !== null) {
+ $filepath = $this->filepath;
+ }
+ return $this->_output($filepath, true);
+ }
+
+ /**
+ * @brief Outputs/saves the image.
+ */
+ private function _output($filepath=null, $really=false) {
+ if($really === false) {
+ header('Content-Type: '.self::mimeType());
+ $filepath = null; // Just being cautious ;-)
+ } else {
+ if(!is_writable(dirname($filepath))) {
+ OC_Log::write('core','OC_Image::_output. Directory \''.dirname($filepath).'\' is not writable.', OC_Log::ERROR);
+ return false;
+ } elseif(is_writable(dirname($filepath)) && file_exists($filepath) && !is_writable($filepath)) {
+ OC_Log::write('core','OC_Image::_output. File \''.$filepath.'\' is not writable.', OC_Log::ERROR);
+ return false;
+ }
+ }
+ $retval = false;
+ switch(self::$imagetype) {
+ case IMAGETYPE_GIF:
+ $retval = imagegif(self::$resource, $filepath);
+ break;
+ case IMAGETYPE_JPEG:
+ $retval = imagejpeg(self::$resource, $filepath);
+ break;
+ case IMAGETYPE_PNG:
+ $retval = imagepng(self::$resource, $filepath);
+ break;
+ case IMAGETYPE_XBM:
+ $retval = imagexbm(self::$resource, $filepath);
+ break;
+ case IMAGETYPE_WBMP:
+ case IMAGETYPE_BMP:
+ $retval = imagewbmp(self::$resource, $filepath);
+ break;
+ default:
+ $retval = imagepng(self::$resource, $filepath);
+ }
+ return $retval;
+ }
+
+ /**
+ * @brief Prints the image when called as $image().
+ */
+ public function __invoke() {
+ return self::show();
+ }
+
+ /**
+ * @returns Returns the image resource in any.
+ */
+ public function resource() {
+ return self::$resource;
+ }
+
+ /**
+ * @returns Returns a base64 encoded string suitable for embedding in a VCard.
+ */
+ function __toString() {
+ ob_start();
+ $res = imagepng(self::$resource);
+ if (!$res) {
+ OC_Log::write('core','OC_Image::_string. Error writing image',OC_Log::ERROR);
+ }
+ return chunk_split(base64_encode(ob_get_clean()));
+ }
+
+ /**
+ * @brief Fixes orientation based on EXIF data.
+ * @returns bool.
+ */
+ public function fixOrientation() {
+ if(!is_resource(self::$resource)) {
+ OC_Log::write('core','OC_Image::fixOrientation() No image loaded.', OC_Log::DEBUG);
+ return false;
+ }
+ if(is_null(self::$filepath) || !is_readable(self::$filepath)) {
+ OC_Log::write('core','OC_Image::fixOrientation() No readable file path set.', OC_Log::DEBUG);
+ return false;
+ }
+ $exif = exif_read_data(self::$filepath, 'IFD0');
+ if(!$exif) {
+ return false;
+ }
+ if(!isset($exif['Orientation'])) {
+ return true; // Nothing to fix
+ }
+ $o = $exif['Orientation'];
+ OC_Log::write('core','OC_Image::fixOrientation() Orientation: '.$o, OC_Log::DEBUG);
+ $rotate = 0;
+ $flip = false;
+ switch($o) {
+ case 1:
+ $rotate = 0;
+ $flip = false;
+ break;
+ case 2: // Not tested
+ $rotate = 0;
+ $flip = true;
+ break;
+ case 3:
+ $rotate = 180;
+ $flip = false;
+ break;
+ case 4: // Not tested
+ $rotate = 180;
+ $flip = true;
+ break;
+ case 5: // Not tested
+ $rotate = 90;
+ $flip = true;
+ break;
+ case 6:
+ //$rotate = 90;
+ $rotate = 270;
+ $flip = false;
+ break;
+ case 7: // Not tested
+ $rotate = 270;
+ $flip = true;
+ break;
+ case 8:
+ $rotate = 270;
+ $flip = false;
+ break;
+ }
+ if($rotate) {
+ $res = imagerotate(self::$resource, $rotate, -1);
+ if($res) {
+ if(imagealphablending($res, true)) {
+ if(imagesavealpha($res, true)) {
+ self::$resource = $res;
+ return true;
+ } else {
+ OC_Log::write('core','OC_Image::fixOrientation() Error during alphasaving.', OC_Log::DEBUG);
+ return false;
+ }
+ } else {
+ OC_Log::write('core','OC_Image::fixOrientation() Error during alphablending.', OC_Log::DEBUG);
+ return false;
+ }
+ } else {
+ OC_Log::write('core','OC_Image::fixOrientation() Error during oriention fixing.', OC_Log::DEBUG);
+ return false;
+ }
+ }
+ }
+
+ /**
+ * @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function.
+ * @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function.
+ * If a resource is passed it is the job of the caller to destroy it using imagedestroy($var)
+ * @returns An image resource or false on error
+ */
+ public function load($imageref) {
+ if(self::loadFromFile($imageref) !== false) {
+ return self::$resource;
+ } elseif(self::loadFromBase64($imageref) !== false) {
+ return self::$resource;
+ } elseif(self::loadFromData($imageref) !== false) {
+ return self::$resource;
+ } elseif(self::loadFromResource($imageref) !== false) {
+ return self::$resource;
+ } else {
+ OC_Log::write('core','OC_Image::load, couldn\'t load anything. Giving up!', OC_Log::DEBUG);
+ return false;
+ }
+ }
+
+ /**
+ * @brief Loads an image from a local file.
+ * @param $imageref The path to a local file.
+ * @returns An image resource or false on error
+ */
+ public function loadFromFile($imagepath=false) {
+ if(!is_file($imagepath) || !file_exists($imagepath) || !is_readable($imagepath)) {
+ // Debug output disabled because this method is tried before loadFromBase64?
+ OC_Log::write('core','OC_Image::loadFromFile, couldn\'t load: '.ellipsis($imagepath, 50), OC_Log::DEBUG);
+ return false;
+ }
+ $itype = exif_imagetype($imagepath);
+ switch($itype) {
+ case IMAGETYPE_GIF:
+ if (imagetypes() & IMG_GIF) {
+ self::$resource = imagecreatefromgif($imagepath);
+ } else {
+ OC_Log::write('core','OC_Image::loadFromFile, GIF images not supported: '.$imagepath, OC_Log::DEBUG);
+ }
+ break;
+ case IMAGETYPE_JPEG:
+ if (imagetypes() & IMG_JPG) {
+ self::$resource = imagecreatefromjpeg($imagepath);
+ } else {
+ OC_Log::write('core','OC_Image::loadFromFile, JPG images not supported: '.$imagepath, OC_Log::DEBUG);
+ }
+ break;
+ case IMAGETYPE_PNG:
+ if (imagetypes() & IMG_PNG) {
+ self::$resource = imagecreatefrompng($imagepath);
+ } else {
+ OC_Log::write('core','OC_Image::loadFromFile, PNG images not supported: '.$imagepath, OC_Log::DEBUG);
+ }
+ break;
+ case IMAGETYPE_XBM:
+ if (imagetypes() & IMG_XPM) {
+ self::$resource = imagecreatefromxbm($imagepath);
+ } else {
+ OC_Log::write('core','OC_Image::loadFromFile, XBM/XPM images not supported: '.$imagepath, OC_Log::DEBUG);
+ }
+ break;
+ case IMAGETYPE_WBMP:
+ case IMAGETYPE_BMP:
+ if (imagetypes() & IMG_WBMP) {
+ self::$resource = imagecreatefromwbmp($imagepath);
+ } else {
+ OC_Log::write('core','OC_Image::loadFromFile, (W)BMP images not supported: '.$imagepath, OC_Log::DEBUG);
+ }
+ break;
+ /*
+ case IMAGETYPE_TIFF_II: // (intel byte order)
+ break;
+ case IMAGETYPE_TIFF_MM: // (motorola byte order)
+ break;
+ case IMAGETYPE_JPC:
+ break;
+ case IMAGETYPE_JP2:
+ break;
+ case IMAGETYPE_JPX:
+ break;
+ case IMAGETYPE_JB2:
+ break;
+ case IMAGETYPE_SWC:
+ break;
+ case IMAGETYPE_IFF:
+ break;
+ case IMAGETYPE_ICO:
+ break;
+ case IMAGETYPE_SWF:
+ break;
+ case IMAGETYPE_PSD:
+ break;
+ */
+ default:
+ self::$resource = imagecreatefromstring(file_get_contents($imagepath));
+ $itype = IMAGETYPE_PNG;
+ OC_Log::write('core','OC_Image::loadFromFile, Default', OC_Log::DEBUG);
+ break;
+ }
+ if($this->valid()) {
+ self::$imagetype = $itype;
+ self::$filepath = $imagepath;
+ self::$destroy = true;
+ }
+ return self::$resource;
+ }
+
+ /**
+ * @brief Loads an image from a string of data.
+ * @param $str A string of image data as read from a file.
+ * @returns An image resource or false on error
+ */
+ public function loadFromData($str) {
+ if(is_resource($str)) {
+ return false;
+ }
+ self::$resource = imagecreatefromstring($str);
+ if(!self::$resource) {
+ OC_Log::write('core','OC_Image::loadFromData, couldn\'t load', OC_Log::DEBUG);
+ return false;
+ }
+ self::$destroy = true;
+ return self::$resource;
+ }
+
+ /**
+ * @brief Loads an image from a base64 encoded string.
+ * @param $str A string base64 encoded string of image data.
+ * @returns An image resource or false on error
+ */
+ public function loadFromBase64($str) {
+ if(!is_string($str)) {
+ return false;
+ }
+ $data = base64_decode($str);
+ if($data) { // try to load from string data
+ self::$resource = imagecreatefromstring($data);
+ if(!self::$resource) {
+ OC_Log::write('core','OC_Image::loadFromBase64, couldn\'t load', OC_Log::DEBUG);
+ return false;
+ }
+ self::$destroy = true;
+ return self::$resource;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @brief Checks if image resource is valid and assigns it to self::$resource.
+ * @param $res An image resource.
+ * @returns An image resource or false on error
+ */
+ public function loadFromResource($res) {
+ if(!is_resource($res)) {
+ return false;
+ }
+ self::$resource = $res;
+ }
+
+ /**
+ * @brief Resizes the image preserving ratio.
+ * @param $maxsize The maximum size of either the width or height.
+ * @returns bool
+ */
+ public function resize($maxsize) {
+ if(!self::$resource) {
+ OC_Log::write('core','OC_Image::resize, No image loaded', OC_Log::ERROR);
+ return false;
+ }
+ $width_orig=imageSX(self::$resource);
+ $height_orig=imageSY(self::$resource);
+ $ratio_orig = $width_orig/$height_orig;
+
+ if ($ratio_orig > 1) {
+ $new_height = round($maxsize/$ratio_orig);
+ $new_width = $maxsize;
+ } else {
+ $new_width = round($maxsize*$ratio_orig);
+ $new_height = $maxsize;
+ }
+
+ $process = imagecreatetruecolor(round($new_width), round($new_height));
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::resize. Error creating true color image',OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+
+ imagecopyresampled($process, self::$resource, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::resize. Error resampling process image '.$new_width.'x'.$new_height,OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ self::$resource = $process;
+ return true;
+ }
+
+ /**
+ * @brief Crops the image to the middle square. If the image is already square it just returns.
+ * @returns bool for success or failure
+ */
+ public function centerCrop() {
+ if(!self::$resource) {
+ OC_Log::write('core','OC_Image::centerCrop, No image loaded', OC_Log::ERROR);
+ return false;
+ }
+ $width_orig=imageSX(self::$resource);
+ $height_orig=imageSY(self::$resource);
+ if($width_orig === $height_orig) {
+ return true;
+ }
+ $ratio_orig = $width_orig/$height_orig;
+ $width = $height = min($width_orig, $height_orig);
+
+ if ($ratio_orig > 1) {
+ $x = ($width_orig/2) - ($width/2);
+ $y = 0;
+ } else {
+ $y = ($height_orig/2) - ($height/2);
+ $x = 0;
+ }
+ $process = imagecreatetruecolor($width, $height);
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::centerCrop. Error creating true color image',OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ imagecopyresampled($process, self::$resource, 0, 0, $x, $y, $width, $height, $width, $height);
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::centerCrop. Error resampling process image '.$width.'x'.$height,OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ self::$resource = $process;
+ return true;
+ }
+
+ /**
+ * @brief Crops the image from point $x$y with dimension $wx$h.
+ * @param $x Horizontal position
+ * @param $y Vertical position
+ * @param $w Width
+ * @param $h Hight
+ * @returns bool for success or failure
+ */
+ public function crop($x, $y, $w, $h) {
+ if(!self::$resource) {
+ OC_Log::write('core','OC_Image::crop, No image loaded', OC_Log::ERROR);
+ return false;
+ }
+ $width_orig=imageSX(self::$resource);
+ $height_orig=imageSY(self::$resource);
+ //OC_Log::write('core','OC_Image::crop. Original size: '.$width_orig.'x'.$height_orig, OC_Log::DEBUG);
+ $process = imagecreatetruecolor($w, $h);
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::crop. Error creating true color image',OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ imagecopyresampled($process, self::$resource, 0, 0, $x, $y, $w, $h, $w, $h);
+ if ($process == false) {
+ OC_Log::write('core','OC_Image::crop. Error resampling process image '.$w.'x'.$h,OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ self::$resource = $process;
+ return true;
+ }
+}
diff --git a/lib/ocsclient.php b/lib/ocsclient.php
index 072fd236fee..9d5932fb720 100644
--- a/lib/ocsclient.php
+++ b/lib/ocsclient.php
@@ -130,6 +130,33 @@ class OC_OCSClient{
return $app;
}
+ /**
+ * @brief Get the download url for an application from the OCS server
+ * @returns array with application data
+ *
+ * This function returns an download url for an applications from the OCS server
+ */
+ public static function getApplicationDownload($id,$item){
+ $url='http://api.apps.owncloud.com/v1/content/download/'.urlencode($id).'/'.urlencode($item);
+
+ $xml=@file_get_contents($url);
+ if($xml==FALSE){
+ OC_Log::write('core','Unable to parse OCS content',OC_Log::FATAL);
+ return NULL;
+ }
+ $data=simplexml_load_string($xml);
+
+ $tmp=$data->data->content;
+ $app=array();
+ if(isset($tmp->downloadlink)) {
+ $app['downloadlink']=$tmp->downloadlink;
+ }else{
+ $app['downloadlink']='';
+ }
+ return $app;
+ }
+
+
/**
* @brief Get all the knowledgebase entries from the OCS server
* @returns array with q and a data
diff --git a/lib/setup.php b/lib/setup.php
index 9e0cc5f3cbd..d454c17599d 100644
--- a/lib/setup.php
+++ b/lib/setup.php
@@ -275,7 +275,7 @@ class OC_Setup {
$content.= "php_value post_max_size 512M\n";
$content.= "SetEnv htaccessWorking true\n";
$content.= "</IfModule>\n";
- $content.= "<IfModule !mod_php5.c>\n";
+ $content.= "<IfModule mod_rewrite.c>";
$content.= "RewriteEngine on\n";
$content.= "RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]\n";
$content.= "</IfModule>\n";
diff --git a/lib/user.php b/lib/user.php
index 241d9aa8b10..34f44f572e0 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -120,7 +120,7 @@ class OC_User {
return false;
}
// No empty username
- if( !$uid ){
+ if(trim($uid) == ''){
return false;
}
// Check if user already exists
@@ -169,7 +169,8 @@ class OC_User {
foreach( OC_Group::getUserGroups( $uid ) as $i ){
OC_Group::removeFromGroup( $uid, $i );
}
-
+ // Delete the user's keys in preferences
+ OC_Preferences::deleteUser($uid);
// Emit and exit
OC_Hook::emit( "OC_User", "post_deleteUser", array( "uid" => $uid ));
return true;
diff --git a/lib/util.php b/lib/util.php
index 466b58078ca..a0c131201e4 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -175,8 +175,8 @@ class OC_Util {
$errors=array();
//check for database drivers
- if(!is_callable('sqlite_open') and !is_callable('mysql_connect')){
- $errors[]=array('error'=>'No database drivers (sqlite or mysql) installed.<br/>','hint'=>'');//TODO: sane hint
+ if(!(is_callable('sqlite_open') or class_exists('SQLite3')) and !is_callable('mysql_connect') and !is_callable('pg_connect')){
+ $errors[]=array('error'=>'No database drivers (sqlite, mysql, or postgresql) installed.<br/>','hint'=>'');//TODO: sane hint
}
$CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" );
$CONFIG_DBNAME = OC_Config::getValue( "dbname", "owncloud" );
diff --git a/settings/apps.php b/settings/apps.php
index 12a7bf77202..40b72639cd6 100644
--- a/settings/apps.php
+++ b/settings/apps.php
@@ -51,22 +51,22 @@ function app_sort($a, $b){
}
usort($apps, 'app_sort');
-// dissabled for now
-// $catagoryNames=OC_OCSClient::getCategories();
-// if(is_array($catagoryNames)){
-// $categories=array_keys($catagoryNames);
-// $externalApps=OC_OCSClient::getApplications($categories);
-// foreach($externalApps as $app){
-// $apps[]=array(
-// 'name'=>$app['name'],
-// 'id'=>$app['id'],
-// 'active'=>false,
-// 'description'=>$app['description'],
-// 'author'=>$app['personid'],
-// 'license'=>$app['license'],
-// );
-// }
-// }
+// apps from external repo via OCS
+ $catagoryNames=OC_OCSClient::getCategories();
+ if(is_array($catagoryNames)){
+ $categories=array_keys($catagoryNames);
+ $externalApps=OC_OCSClient::getApplications($categories);
+ foreach($externalApps as $app){
+ $apps[]=array(
+ 'name'=>$app['name'],
+ 'id'=>$app['id'],
+ 'active'=>false,
+ 'description'=>$app['description'],
+ 'author'=>$app['personid'],
+ 'license'=>$app['license'],
+ );
+ }
+ }
diff --git a/settings/js/users.js b/settings/js/users.js
index 4fea52e4a1f..79b4e80870a 100644
--- a/settings/js/users.js
+++ b/settings/js/users.js
@@ -126,7 +126,7 @@ $(document).ready(function(){
$('#newuser').submit(function(event){
event.preventDefault();
var username=$('#newusername').val();
- if(username == '') {
+ if($.trim(username) == '') {
alert('Please provide a username!');
return false;
}